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

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

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

if ( a == 1 && ( b == 1 || b == 2 )) { ... }

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

if [[ $a -eq 1 ]]; then
  if [[ $b -eq 1 || $b -eq 2 ]]; then
     ...
  fi
fi

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

将这两者结合起来的语法是什么如果合为一?

答案1

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

仅使用一[ ]

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

或者避免 POSIX-a-o选项1

if [ 1 -eq "$a" ] && { [ 1 -eq "$b" ] || [ 2 -eq "$b" ]; }; then
    # ...
fi

1-a避免and的原因之一-o是最大可移植性 - 并非所有testor[实现都可以处理超过 4 个参数,这正是使用-aand-o和链接表达式时得到的结果\( \)

答案2

我尝试了一些语法并发现

if [[ $a -eq 1 ]] && [[ $b -eq 1 || $b -eq 2 ]]; then
 ...
fi

工作中。

答案3

另一种 POSIX 方法:

if [ "$((a == 1 && ( b == 1 || b == 2 )))" -ne 0 ]; then
  ...
fi

答案4

正确的方法只需shell

if test 1 -eq "$a" && test 1 -eq "$b" -o 2 -eq "$b"; then 
    ...
fi

解释:

test这里充当括号和-o逻辑或。如果你有逻辑并且在“括号”内,你会使用-a.

可以找到更多相关内容这里

相关内容