[ "$VAR" = "" ] 和 [ -z "$VAR" ] 总是等价的吗?

Min*_*nix 8 shell-script

我的代码看起来像这样:

VAR=""

while [ -z "$VAR" ]; do
  VAR=$( command | grep "important_string" )
done
Run Code Online (Sandbox Code Playgroud)

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

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

Bas*_*tch 5

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

正如Celada所评论的,当使用[ "$VAR" = "" ] ifVAR是一些有效的测试(例如 if VARis -z)时可能会发生不好的事情,特别是当[(or test)不是内置的 shell 时。但是 on bashor zshthe [is a builtin,这似乎不是问题。你可以[ "x$VAR" = "x" ]用于你的测试。见测试(1)

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

也许-z可能会稍微快一点(但您不应该关心 shell 脚本中的微秒)并且您可能会发现=可能更具可读性。

  • 我虽然确定 `[ "$VAR" = "" ]` 是错误的,因为如果 `$VAR` 的内容以连字符开头,那么它会导致语法错误,例如,如果 `$VAR` 包含`-z` 然后它会扩展为 `[ -z = "" ]` — 是否会测试 `=` 是否为空(它不是),然后将 `""` 视为无关参数?但是,既然我在阅读了您的答案后尝试了它,那么我似乎无法以这种方式失败!几十年来,我一直在使用像 `[ "x$VAR" = "xfoo" ]` 这样的结构来防止 `$VAR` 中的特殊字符,也许是不必要的! (5认同)