在变量中存储带有空格的命令时,保留参数拆分

时间:2014-04-21 10:16:57

标签: bash

我希望在变量中存储命令行,然后执行该命令行。问题是,命令行的参数中包含空格。如果我做

$ 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

2 个答案:

答案 0 :(得分:5)

安全的方法是将命令行存储在BASH数组中:

arr=( command "complex argument" )

然后执行它:

"${arr[@]}"

或者另一种方法是使用BASH功能:

cmdfunc() {
    command "complex argument" 
}

cmdfunc

答案 1 :(得分:2)

另一种解决方案是

x='command "complex argument"'
eval $x