有一个名为app
的executbale,它可以采用一些选项和命令行参数,-l -v
,仅举几例。现在我正在写一个bash
脚本,其中app
将被调用一些选项,我这样做了,
opt_string="-l -v" # this string might change according to different conditions used in if-else
# HERE is my problem
./app ${opt_string}
看看我是如何调用app
的,通常我只是在这样的提示shell中调用它:
./app -l -v
但现在在这个剧本中,它实际上是这样的:
./app "-l -v"
cuz ${opt_string}
是由""
引用的STRING,如果是,我怀疑app
是否会正常运行。
我知道使用eval "./app ${opt_string}"
可能有办法解决这个问题,但有没有办法剥离""
?
答案 0 :(得分:2)
BASH FAQ#50:"I'm trying to put a command in a variable, but the complex cases always fail!"
opt_string=(-l -v)
./app "${opt_string[@]}"
答案 1 :(得分:1)
你调用的方式(./app ${opt_string}
)没关系。您将opt_string
定义为单个字符串,因为您引用了赋值中的值。但是,当您取消引用它时,您没有使用引号,因此shell将替换其值,然后将其拆分为单个单词。
当你说
时./app "$opt_string"
您正在向应用传递一个参数。当你说
./app $opt_string
您正在向该应用传递多个参数。
请参阅bash手册中的word splitting。
请注意,大括号不是引号。大括号(在此上下文中)仅用于消除变量名与周围文本的歧义,即echo "$opt_string_blah"
与echo "${opt_string}_blah"