shell中复杂条件的语法是什么?

Off*_*rmo 11 shell

如果想在 shell (sh) 中表达以下测试:

if ( a == 1 && ( b == 1 || b == 2 )) { ... }
Run Code Online (Sandbox Code Playgroud)

到目前为止,我能写的最好的是:

if [[ $a -eq 1 ]]; then
  if [[ $b -eq 1 || $b -eq 2 ]]; then
     ...
  fi
fi
Run Code Online (Sandbox Code Playgroud)

我不知道如何复合&&和|| 具有正确的优先级。谷歌搜索没有给我任何答案(教程只给出基本的例子,如果有的话)

将这两个if合二为一的语法是什么?

jw0*_*013 15

请注意,[[ ]]它不在 Bourne 或 POSIX 中sh。对于真正的sh语法,有几种方法可以做到这一点。

只使用一[ ]

if [ 1 -eq "$a" -a \( 1 -eq "$b" -o 2 -eq "$b" \) ]; then
    # ...
fi
Run Code Online (Sandbox Code Playgroud)

避免 POSIX-a-o选项1

if [ 1 -eq "$a" ] && { [ 1 -eq "$b" ] || [ 2 -eq "$b" ]; }; then
    # ...
fi
Run Code Online (Sandbox Code Playgroud)

1个一个原因,避免-a-o最大便携性-不是所有test[实现可以处理超过4个参数,而这恰恰是如果您将表达式与你所得到的-a-o\( \)

  • @Offirmo 如果您将脚本声明为 `/bin/sh`,则使用不在 `sh` 中的功能编写脚本是不正确的。你应该知道 `ksh` 不是 `sh`,而是 `sh` 的超集。如果你将你的 `ksh`-but-declared-as-`sh` 脚本带到一个 `sh` 不是 `ksh` 的符号链接的系统中,它可能会中断。您可以通过确保您的脚本与声明匹配来避免该问题。 (2认同)
  • 问题不在于某些实现不支持 `-a`/`-o`,而是它对于任意参数不可靠。像 `[ "$a" = "$b" -o "$b" = "$c" ]` 会失败,比如 `$a` 的值,比如 `!` 和许多 `[` 实现。 (2认同)