我希望在变量中存储命令行,然后执行该命令行。问题是,命令行的参数中包含空格。如果我做
$ x='command "complex argument"'
$ $x
它使用command
和"complex
调用argument"
。我尝试使用"$x"
认为它会保留参数拆分,但它只尝试执行文件名为command "complex argument"
的程序。我还尝试过引号的变体('
vs "
)并使用exec
,但它没有帮助。有什么想法吗?
编辑:eval "$x"
几乎有效,但如果分隔参数的空格是换行符而不是空格,则它将这些行视为单独的命令。
Edit2:额外的"
引号太多了,并且eval将新行解释为空格,而不是命令分隔符。答案中的解决方案都有效。
出于测试目的,我定义:
$ function args() { while [[ "$1" != "" ]]; do echo arg: $1; shift; done }
这可以按预期工作:
$ args "1 2" 3
arg: 1 2
arg: 3
$ x="arg 4 5 6"
$ $x
arg: 4
arg: 5
arg: 6
这不是:
$ x="args \"3 4\" 5"
$ $x
arg: "3
arg: 4"
arg: 5
答案 0 :(得分:5)
安全的方法是将命令行存储在BASH数组中:
arr=( command "complex argument" )
然后执行它:
"${arr[@]}"
或者另一种方法是使用BASH功能:
cmdfunc() {
command "complex argument"
}
cmdfunc
答案 1 :(得分:2)
另一种解决方案是
x='command "complex argument"'
eval $x