常说变量在使用时要双引号。
在以下示例中,我希望将命令echo "You can't see me"
放在变量中并以输出为You can't see me
. 这是最终目标。
$ cmd="echo \"You can't see me\""
$ echo "$cmd"
echo "You can't see me"
$ $cmd
"You can't see me"
$ "$cmd"
echo "You can't see me": command not found
所以$cmd
跑了,它包含了我不想有的双引号,并且遵循双引号变量的建议导致了一个错误。
尽管资源表明它们总是应该被使用,但该建议是否有例外?
我知道如何通过运行eval "$cmd"
(或不带双引号)或在运行后对输出进行适当的转换$cmd
(不带双引号)来获得我想要的结果,但是我该如何避免这个问题呢?
不要盲目听从“建议”;没有办法“正确”地进行货物崇拜编程。是否有一些主要的“资源”,例如 bash(1) 联机帮助页或标准规范?
如果要将字符串评估为脚本片段,则应使用
eval
. 这就是它的用途:当您使用不带引号的变量时,将不会再次扫描其扩展以查找单引号或双引号等 shell 元字符并重新解析,而只会根据
IFS
变量中的字符进行拆分并进行全局扩展(如果它包含任何*
,?
或[
字符):在最后一个示例中,将
cmd
展开,然后 拆分为echo
、"What's
、和,也将在其论点中解释和其他转义)。a
*?
"
*?
echo
echo
\n