过去的旧建议是对任何涉及 a 的表达式加双引号$VARIABLE,至少在希望 shell 将其解释为单个项目的情况下,否则,内容中的任何空格$VARIABLE都会脱离 shell。
但是,我知道在较新版本的 shell 中,不再总是需要双引号(至少出于上述目的)。例如,在bash:
% FOO='bar baz'
% [ $FOO = 'bar baz' ] && echo OK
bash: [: too many arguments
% [[ $FOO = 'bar baz' ]] && echo OK
OK
% touch 'bar baz'
% ls $FOO
ls: cannot access bar: No such file or directory
ls: cannot access baz: No such file or directory
Run Code Online (Sandbox Code Playgroud)
在zsh,而另一方面,同样的三个命令成功。因此,基于此实验,似乎在 中bash可以省略 内部的双引号[[ ... ]],但不能省略内部 …
有时候,我看到shell脚本使用所有的引用一些文字,这些不同的方式:"...",'...',$'...',和$"..."。为什么有这么多不同类型的引用被使用?
他们的行为是否有所不同或影响了我在他们内部可以做的事情?
我经常最终通过 ssh 发出复杂的命令;这些命令涉及到 awk 或 perl 一行的管道,因此包含单引号和 $。我既无法找出正确执行引用的硬性规则,也没有找到很好的参考。例如,请考虑以下事项:
# what I'd run locally:
CMD='pgrep -fl java | grep -i datanode | awk '{print $1}'
# this works with ssh $host "$CMD":
CMD='pgrep -fl java | grep -i datanode | awk '"'"'{print $1}'"'"
Run Code Online (Sandbox Code Playgroud)
(注意 awk 语句中的额外引号。)
但是我如何让它与它一起工作,例如ssh $host "sudo su user -c '$CMD'"?在这种情况下是否有管理报价的通用方法?..