切勿将 `-a` 或 `-o` 运算符与 `[` 一起使用

Tim*_*Tim 11 shell bash test

斯蒂芬·查泽拉斯写道:

一些规则,如

  • 总是引用变量
  • 永远不要使用-aor-o运算符(使用多个[命令和&&and ||shell 运算符)

[与POSIX壳可靠。

为什么“永远不要使用-aor-o运算符”?

我怎样才能“使用多个[命令&&||shell 运算符)”?

kos*_*kos 13

为什么“永远不要使用-aor-o运算符”?

因为它们可能是模棱两可的,因此它们不符合 POSIX 标准

指定 -a 和 -o 二进制原色以及“(”和“)”运算符的 XSI 扩展已被标记为过时。(根据正在评估的特定表达式,使用它们的许多表达式由语法模糊定义。)使用这些表达式的脚本应转换为下面给出的形式。尽管许多实现将继续支持这些过时的形式,脚本在处理用户提供的输入时应该非常小心,这些输入可能与这些和其他主要和运算符混淆。除非应用程序开发人员知道产生脚本输入的所有情况,否则调用如下:

test "$1" -a "$2"

应该写成:

test "$1" && test "$2"

我怎样才能“使用多个[命令&&||shell 运算符)”?

通过进行多个测试并使用所述运算符链接它们;例如:

[ 0 -eq 0 -a \( 0 -eq 1 -o 1 -eq 1 \) ]
Run Code Online (Sandbox Code Playgroud)

可以重写为等价物:

[ 0 -eq 0 ] && ([ 0 -eq 1 ] || [ 1 -eq 1 ])
Run Code Online (Sandbox Code Playgroud)

或更好:

[ 0 -eq 0 ] && { [ 0 -eq 1 ] || [ 1 -eq 1 ]; }
Run Code Online (Sandbox Code Playgroud)