【发布时间】:2018-04-27 14:08:19
【问题描述】:
我正在尝试创建一个 shell 脚本,它将多个命令连接到一个字符串,然后执行这些命令。
以下成功(创建 'y' 和 'z' 文件并打印 ls 输出):
$ /bin/touch /z && ls && /bin/touch /y
但以下失败(创建 'y' 和 'z' 文件,还有一个 '&&' 和 'ls' 文件)
$ A="/bin/touch /z && ls && /bin/touch /y"
$ $A
似乎通过使用$A 执行该行,二进制touch 将字符串的其余部分作为参数,而&& 运算符未按预期执行。
(我也尝试用;、|| 等切换&&,但得到了相同的结果)
我发现 eval $A 可以解决问题,但我仍然很好奇为什么会发生这种情况。 (并且可能想跳过评估的需要)
谢谢!
【问题讨论】:
-
&&在变量扩展之前被解释,所以这永远不会起作用。 -
但是
$A不只是用字符串替换表达式,因此&&的解释与不使用字符串运行它完全相同? -
不,它不是这样工作的,有一个操作顺序。
-
你必须使用
eval,但除非你的目标是编写一个可以执行任意用户输入的程序,否则你应该定义一个shell函数。 -
这在BashFAQ #50中也有详细介绍。
标签: bash shell string-evaluation