如何在bash中将带有值的字符串作为命令运行?

pos*_*ing 17 bash string shell-script command

这是我的小 bash 脚本片段。

i=5
command='echo $i'
$command
Run Code Online (Sandbox Code Playgroud)

我希望这个脚本打印,5即,我希望它运行 echo 并打印 5。但它一直在打印$i。那么我该如何解决这个问题呢?

Sté*_*las 28

那将是:

eval "$command"
Run Code Online (Sandbox Code Playgroud)

如果您希望将 的内容$command作为 shell 代码进行评估。

如果您不能保证$command不会以开头-(这会导致eval在某些 shell中将bash其视为一个选项),您可能需要运行:

eval " $command"
Run Code Online (Sandbox Code Playgroud)

反而。额外的前导空格不会影响命令的解析方式,并且不会$command被视为eval-. eval -- "$command"也可以在某些 shell(包括bash)中工作,但不是 POSIX (IIRC),并且不能在dashBourne shell 中工作。

请注意,您$command可能应该是:

command='echo "$i"'
Run Code Online (Sandbox Code Playgroud)

除非您确实打算$i受到 split+glob 的影响

将代码存储在“变量”中的一种可能更好的方法是使用函数:

mycommand() { echo "$i"; }
Run Code Online (Sandbox Code Playgroud)

(使用mycommand代替command,因为command已经是一个现有的命令)。

如果$commandbreak/ continue/ return,行为将取决于外壳有所不同。

如果您想$command存储一个简单的 command,即一个单词列表,其中第一个被查找为以单词列表作为参数执行的命令,您可以使用数组变量:

command=('echo' '$i' "$i")
"${command[@]}"
Run Code Online (Sandbox Code Playgroud)

这将运行echo,与echo$i与内容$i作为参数。

command='echo $i ;x /* '$i
$command
Run Code Online (Sandbox Code Playgroud)

(默认值为$IFS)是最没有意义的。在那里,$command将包含一个字符串。第一个$i保持原样,第二个扩展(在单引号之外),然后该字符串将受到 split+glob(因为$command不在双引号内),其结果将导致多个单词,被采用再次作为一个简单的命令