我知道这个约定有两个原因:
http://tldp.org/LDP/abs/html/comparison-ops.html
在复合测试中,即使引用字符串变量也可能不够。如果$ string为空,[-n“ $ string” -o“ $ a” =“ $ b”]可能会导致某些版本的Bash出错。安全的方法是在可能为空的变量后面添加一个额外的字符[[x $ string“!= x -o” x $ a“ =” x $ b“](“ x的”取消)。
其次,在除Bash之外的其他shell中,尤其是较旧的shell中,不存在用于测试空变量的测试条件(例如“ -z”),因此:
if [ -z "$SOME_VAR" ]; then
echo "this variable is not defined"
fi
如果您希望在各种UNIX环境中实现可移植性,而在这些环境中您不能确定默认的shell是Bash以及它是否支持-z测试条件,那么使用Bash会更安全,如果使用[ x $ SOME_VAR“ =” x“],因为那样总是可以达到预期的效果。从本质上讲,这是一个用于查找空变量的古老的Shell脚本技巧,尽管有更清洁的方法可用,但今天它仍用于向后兼容。
本文探讨了在Shell脚本中测试变量是否为空时遇到的问题,特别是在不同版本的Bash和其他Shell中的兼容性问题。文章提供了两种可靠的测试方法,并解释了为何在现代Shell脚本中仍然需要考虑这些古老技巧。

258

被折叠的 条评论
为什么被折叠?



