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

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

这是我的 bash 脚本小片段。

i=5
command='echo $i'
$command

我希望这个脚本打印5ie,我希望它运行 echo 并打印 5。但它却继续打印$i。那么我该如何解决这个问题呢?

答案1

那将是:

eval "$command"

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

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

eval " $command"

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

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

command='echo "$i"'

除非你确实打算$i采用 split+glob

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

mycommand() { echo "$i"; }

(使用mycommand而不是command,因为它command已经是现有命令)。

如果$commandbreak// continuereturn行为将根据 shell 的不同而有所不同。

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

command=('echo' '$i' "$i")
"${command[@]}"

这将运行echoecho$i的内容$i作为参数。

command='echo $i ;x /* '$i
$command

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

相关内容