保留字符串中的空格作为命令行参数

cro*_*ire 7 bash scripting whitespace

我在这里面临一个小问题,我想将包含空格的字符串传递给另一个程序,以便将整个字符串视为命令行参数.

简而言之,我想通过bash shell脚本执行以下结构的命令:command_name -a arg1 -b arg2 -c"arg with whitespaces here"

但无论我如何尝试,空格都不会保留在字符串中,默认情况下会被标记化.请一个解决方案,

编辑:这是我的脚本的主要部分:

#!/bin/bash

#-------- BLACKRAY CONFIG ---------------#
# Make sure the current user is in the sudoers list
# Running all instances with sudo

BLACKRAY_BIN_PATH='/opt/blackray/bin' 
BLACKRAY_LOADER_DEF_PATH='/home/crozzfire'
BLACKRAY_LOADER_DEF_NAME='load.xml'
BLACKRAY_CSV_PATH='/home/crozzfire'
BLACKRAY_END_POINT='default -p 8890'
OUT_FILE='/tmp/out.log'

echo "The current binary path is $BLACKRAY_BIN_PATH"


# Starting the blackray 0.9.0 server
sudo "$BLACKRAY_BIN_PATH/blackray_start"

# Starting the blackray loader utility
BLACKRAY_INDEX_CMD="$BLACKRAY_BIN_PATH/blackray_loader -c $BLACKRAY_LOADER_DEF_PATH/$BLACKRAY_LOADER_DEF_NAME -d $BLACKRAY_CSV_PATH -e "\"$BLACKRAY_END_POINT\"""

sudo time $BLACKRAY_INDEX_CMD -a $OUT_FILE

#--------- END BLACKRAY CONFIG ---------#
Run Code Online (Sandbox Code Playgroud)

Gor*_*son 5

您遇到此问题是因为您将命令存储在变量中,然后再将其展开; 除非有充分的理由这样做,否则不要:

sudo time $BLACKRAY_BIN_PATH/blackray_loader -c $BLACKRAY_LOADER_DEF_PATH/$BLACKRAY_LOADER_DEF_NAME -d $BLACKRAY_CSV_PATH -e "$BLACKRAY_END_POINT" -a $OUT_FILE
Run Code Online (Sandbox Code Playgroud)

如果你真的需要存储命令并在以后使用它,有几个选项; bash-hackers.org wiki有一个关于这个主题好页面.在我看来,最有用的是将命令放在数组而不是简单的变量中:

BLACKRAY_INDEX_CMD=($BLACKRAY_BIN_PATH/blackray_loader -c $BLACKRAY_LOADER_DEF_PATH/$BLACKRAY_LOADER_DEF_NAME -d $BLACKRAY_CSV_PATH -e "$BLACKRAY_END_POINT")

sudo time "${BLACKRAY_INDEX_CMD[@]}" -a $OUT_FILE
Run Code Online (Sandbox Code Playgroud)

这避免了空格分隔单词和单词内空间之间的整体混淆,因为单词不是由空格分隔的 - 它们位于数组的单独元素中.使用[@]后缀扩展带双引号的数组会保留该结构.

(顺便说一句,另一种选择是使用转义引号,而不是像你正在做的那样,然后运行命令eval.不要这样做;这是引入奇怪的解析错误的好方法.)


dim*_*mba 1

可能您需要用双引号将参数引起来(例如“${6}”)。

在 OP 评论之后,它应该是“$BLACKRAY_END_POINT”