如果想在 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
是最大可移植性 - 并非所有test
or[
实现都可以处理超过 4 个参数,这正是使用-a
and-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
.
可以找到更多相关内容这里