我正在尝试从 shell 脚本中的变量运行命令。正在使用的 shell 是 bash shell。
文件 exp
包含:
abcdef
执行以下命令:
sed s/b/\ / exp
...产生输出:
a cdef
但是执行:
cmd="sed s/b/\ / exp"
echo $cmd
$cmd
...产生以下错误:
sed s/b/\ / exp
sed: -e expression #1, char 5: unterminated `s' command
我可以看到在执行前添加 eval
是有效的。但我不明白为什么。您能解释一下为什么一种方法有效而另一种无效吗?
最佳答案
您遇到的问题是空间本身没有被 Bash 正确解释。
如果将 b
替换为另一个字符,比如 X
,看看效果如何:
$ cmd="sed s/b/X/ exp"
$ $cmd
aXcdef
因此解决方法是使用十六进制表示空格,即 20
:
$ cmd="sed s/b/\x20/ exp"
$ $cmd
a cdef
或使用 eval
执行命令本身:
$ cmd="sed s/b/\ / exp"
$ eval "$cmd"
a cdef
正如 Tom Fenech 所建议的那样,将命令存储在变量中并不是一个好的方法,如 I'm trying to put a command in a variable, but the complex cases always fail! 中所述。 .它有时可以工作,但在其他情况下会产生不可预测的结果。另一种方法是考虑使用函数。
最后,请注意 eval
在这种情况下会派上用场,只是要非常小心存储的内容。一些好的阅读:Variable as command; eval vs bash -c .
关于linux - 从 shell 脚本中的变量运行 shell 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28580226/