[“ $ VAR” =“”]和[-z“ $ VAR”]始终相等吗?


8

我的代码如下所示:

VAR=""

while [ -z "$VAR" ]; do
  VAR=$( command | grep "important_string" )
done

所以我想轮询的输出command,直到important_string出现并放入$VAR

有没有之间的功能差异[ -z "$VAR" ][ "$VAR" = "" ]


3
==是不正确的语法,但可以在许多shell中使用(大概是因为使用任何其他语言的人都对它记忆犹新)。您应该使用=
l0b0

@ l0b0 ==从某处复制了。我的错。
Minix

Answers:


5

是的,它们([ -z "$VAR" ][ "$VAR" = "" ]...)是等效的。两者都在测试是否为空$VAR(例如,当它未绑定或设置为空字符串时)。

正如Celada所说,在使用[ "$VAR" = "" ] if VAR是一些有效的测试(例如if VARis -z)时,尤其是在[(或test不是内置的shell 时,可能会发生不好的事情。但是on bashzshthe [是内置函数,这似乎不是问题。您可以使用它[ "x$VAR" = "x" ]进行测试。参见测试(1)

当然,我假设使用一些POSIX shell或类似的东西。

也许-z会稍快一些(但是您不应该在shell脚本中关注微秒),并且可能会发现=它更具可读性。


5
我可以肯定这[ "$VAR" = "" ]是错误的,因为如果的内容$VAR以连字符开头,则将导致语法错误,例如,如果$VAR包含,-z则它将扩展为[ -z = "" ]-测试是否=为空(不是)然后""视为无关紧要的论点?但是我似乎无法使它以这种方式失败,因为我在阅读了您的回答后尝试了一下!数十年来,我一直在使用诸如[ "x$VAR" = "xfoo" ]防止特殊字符之类的构造$VAR,也许是不必要的!
Celada

@Celada:我认为您的观点对test没有内置功能的罕见外壳是正确的。
Basile Starynkevitch 2015年

1
我认为,关于扩展,shell内置命令的行为应与外部命令相同。您是否将其与[[bash之类的关键字混淆了?他们真的不同。---我没有观察到关于testbash内置变量扩展的任何特殊行为。
pabouk


@Celada实际上,您是对的,使用很多东西可能会出错,而使用起来[ "$VAR" = "" ]更安全-z
Braiam
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.