Joh*_*han 31 bash shell-script
在 Bash shell 脚本中,以下两个语句之间有什么区别(如果有)?
if [ -z "$1" ] if [ "$1" = "" ]我发现自己在一些脚本中编写了第二个脚本,但后来我在这里读到使用-z实现了同样的事情。
如果使用第二个有问题,我们是否应该忽略第一个看起来更好一点?
Gil*_*il' 40
[ "$1" = "" ]并且[ -z "$1" ]在 bash 和其他符合 POSIX 的 shell 中完全等效。(请注意,括号的每一侧都必须有一个空格,除非有像 那样的非单词组成字符;。)
[是一个内置的外壳;事实上它也可以拼写test(两者的唯一区别是[需要 a]作为最后一个参数)。所以,如果你运行[ "$1" = "" ]与$1扩展到-z,测试操作员可以看到三个参数:-z,=和空字符串。当操作数以这种方式看起来像运算符时,一些较旧的Bourne shell 有时会抛出解析错误,即使完整表达式中没有歧义。我不知道是否有任何版本实际上对这个特定的表达式有问题,但更复杂的表达式可能会抛弃它们。也可能有一些版本在空词方面有问题;这些也不支持[ -z "$1" ]。一个常见的 shell 习语是[ x"$1" = x"" ]. 它避免了将操作数解析为运算符的任何风险,因为没有运算符以字母开头。
在 ksh、bash 和 zsh 中,您可以使用双括号语法[[ -z $1 ]]. 这种较新的语法(来自 1980 年代后期而不是 1970 年代中期)通过使用特殊的句法构造而不是普通的内置来消除将操作数解析为运算符的风险。运算符必须按字面出现,在双括号内不加引号,并且您不需要双引号变量扩展。