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已经是一个现有的命令)。
如果$command是break/ 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不在双引号内),其结果将导致多个单词,被采用再次作为一个简单的命令。