在Bash中,是否[-z“ $ 1”]和[[$ 1” =“””是否相同?


28

在Bash Shell脚本中,以下两个语句之间有什么区别(如果有)?

    1.) if [ -z "$1" ]
    2.) if [ "$1" = "" ]

我发现自己在某些脚本中编写了第二本,但是随后我在这里读到,使用-z可以达到相同的目的。

如果在使用第二个方法时遇到问题,我们是否应该忽略第一个方法看起来更好一些?


3
有关详细的比较,请参阅我关于堆栈溢出的答案。另外,请参阅
暂停,直到另行通知。

友善的链接,并给出了一些不错的答案:)
Johan 2010年

Answers:


36

[ "$1" = "" ][ -z "$1" ]在bash和其他POSIX兼容的外壳完全等同。(请注意,括号的每一侧都必须有一个空格,除非存在非单词组成的字符,如;。)

[是像其他任何内置的外壳;实际上,它也可以拼写test(两者之间的唯一区别是,最后一个参数[要求a ])。所以,如果你运行[ "$1" = "" ]$1扩展到-z,测试操作员可以看到三个参数:-z=和空字符串。当操作数看起来像运算符时,某些较旧的Bourne shell有时会抛出解析错误,即使完整表达式中没有歧义也是如此。我不知道是否有任何版本实际上对这个特定表达式有问题,但是更复杂的表达式可能会使它们无法正常运行。可能还有一些版本的空词有问题;这些都不会支持[ -z "$1" ]。常见的shell习惯用法是[ x"$1" = x"" ]。它避免了将操作数解析为运算符的任何风险,因为没有运算符以字母开头。

在ksh,bash和zsh中,可以使用双括号语法[[ -z $1 ]]。这种较新的语法(从1980年代末开始,而不是1970年代中期开始)消除了使用特殊的语法结构而非普通的内置语法将操作数解析为运算符的风险。运算符必须从字面上出现,在双括号中不加引号,并且您不必对变量扩展名加双引号。


修正了拼写错误,括号旁边缺少空格。
约翰
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.