在 Bash shell 脚本中,以下两个语句之间有什么区别(如果有)?
if [ -z "$1" ]
if [ "$1" = "" ]
我发现自己在一些脚本中写了第二个,但后来我读到这里使用-z
可以达到同样的效果。
如果使用第二个有问题,我们是否应该忽略第一个看起来更好一点?
答案1
[ "$1" = "" ]
并且[ -z "$1" ]
在 bash 和其他 POSIX 兼容 shell 中完全相同。 (请注意,括号两侧必须有一个空格,除非有非单词组成字符,例如;
。)
[
是一个像其他 shell 一样的内置 shell;事实上它也可以被拼写test
(两者之间的唯一区别是[
需要 a]
作为最后一个参数)。因此,如果您运行扩展为[ "$1" = "" ]
,测试运算符会看到三个参数:和空字符串。有些年纪大了$1
-z
-z
=
伯恩当操作数以这种方式看起来像运算符时,shell 有时会抛出解析错误,即使完整表达式中没有歧义。我不知道是否有任何版本实际上对这个特定的表达式有问题,但更复杂的表达式可能会让它们失败。也可能有一些版本存在空洞的问题;这些也不会支持[ -z "$1" ]
。一个常见的 shell 习惯用法是[ x"$1" = x"" ]
.它避免了将操作数解析为运算符的任何风险,因为没有运算符以字母开头。
在 ksh、bash 和 zsh 中,您可以使用双括号语法[[ -z $1 ]]
.这种较新的语法(来自 20 世纪 80 年代末而不是 1970 年代中期)消除了通过使用特殊语法结构而不是普通内置语法将操作数解析为运算符的风险。运算符必须按字面意思出现,在双括号内不加引号,并且不需要双引号变量扩展。