Answers:
请注意,[[ ]]它不在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和-o最大便携性-不是所有test或[实现可以处理超过4个参数,而这恰恰是如果您将表达式与你所得到的-a和-o和\( \)。
/bin/sh,则使用not中的功能编写脚本是不正确的sh。您应该意识到,这ksh不是sh,而是的超集sh。如果将ksh-but-declared-as- shscript带到sh不是符号链接的系统,则ksh它可能会中断。您可以通过确保脚本与声明匹配来避免该问题。
/bin/shwill 的shebang /bin/sh。问题是/bin/sh不接受[[。您不能使用也不能使用[[接受接受的shell [[,例如ksh作为shebang。
-a/ -o,但是对于任意参数来说并不可靠。就像[ "$a" = "$b" -o "$b" = "$c" ]将失败的值$a一样!有许多[的实现。
另一种POSIX方法:
if [ "$((a == 1 && ( b == 1 || b == 2 )))" -ne 0 ]; then
...
fi
仅需正确的方法即可shell:
if test 1 -eq "$a" && test 1 -eq "$b" -o 2 -eq "$b"; then
...
fi
说明:
test这里用作括号和-o逻辑或。如果您逻辑上且在“括号”内,则可以使用-a。
ksh?那么您的初始代码将只需要一对括号即可:if (( a == 1 && ( b == 1 || b == 2 ))); then :; fi