这是我的 bash 脚本小片段。
i=5
command='echo $i'
$command
我希望这个脚本打印5
ie,我希望它运行 echo 并打印 5。但它却继续打印$i
。那么我该如何解决这个问题呢?
答案1
那将是:
eval "$command"
如果您希望将 的内容$command
评估为 shell 代码。
如果你不能保证$command
不会开始-
(这会导致eval
在某些 shell 中将bash
其视为一个选项),你可能需要运行:
eval " $command"
反而。额外的前导空格不会影响命令的解析方式,并且$command
如果eval
命令以-
.eval -- "$command"
也可以在某些 shell(包括bash
)中工作,但不是 POSIX (IIRC),并且不能在dash
Bourne shell 中工作。
请注意,您$command
可能应该是:
command='echo "$i"'
除非你确实打算$i
采用 split+glob
将代码存储在“变量”中的一个可能更好的方法是使用函数:
mycommand() { echo "$i"; }
(使用mycommand
而不是command
,因为它command
已经是现有命令)。
如果$command
是break
// continue
,return
行为将根据 shell 的不同而有所不同。
如果你想$command
存储一个简单的命令,这是一个单词列表,其中第一个单词被查找为以单词列表作为参数执行的命令,您可以使用数组变量:
command=('echo' '$i' "$i")
"${command[@]}"
这将运行echo
、echo
和$i
的内容$i
作为参数。
command='echo $i ;x /* '$i
$command
(默认值为$IFS
)是最没有意义的。在那里,$command
将包含一个字符串。第一个$i
保留原样,第二个扩展(如单引号之外),然后该字符串将受到 split+glob(因为$command
不在双引号内)的影响,其结果将导致许多单词,采取作为一个简单的命令再次。