例如test -e
:
VAR="<this is a file path: /path/to/file/or/dir"
test -e $VAR && do_something || do_anotherthing
问题:我应该"$VAR"
在这里使用吗?,如果没有必要,我不喜欢冗长,因为$VAR
显然在这种情况下是一个路径,那么如果它是空字符串,它应该总是失败,因为没有空字符串的路径,然后按照我的逻辑,双引号是没有必要的。
但它是字符串测试的情况,例如 test -n:
VAR="<this is a string"
test -n $VAR && do_something || do_anotherthing
然后按照我的逻辑,$VAR
应该放在双引号中:"$VAR"
因为它可以扩展为空字符串,如果不在双引号中,则将仅扩展为-n
参数并且始终为真。
所以实际的问题是因为我怀疑我们是否应该只在测试命令中使用双引号,只使用-n
和-z
反对字符串?
一般规则是对任何变量进行双引号,除非您希望 shell 对其内容执行标记拆分和通配符扩展。
恰恰相反。没有操作数的行为
test -e
是在这种特殊情况下应该引用变量的另一个原因:请参阅此问答、Greg 的 Wiki和手册以获取解释。tl;dr:它是如何工作的并不明显,你应该使用更多行情™。或者换一种说法:如果您的目标是正确性和可维护性,那么正确引用大约是优先级 5(在学习了编写正确和简洁的 shell 脚本所需的所有其他怪异之后),而保存单个字符是优先级 999,999+。
这会更好,更清晰: