如何在Shell脚本中执行逻辑或操作

我试图做一个简单的条件检查,但它似乎并没有工作。

如果$#等于0或者大于1那就打个招呼吧。

我尝试过以下语法,但没有成功:

 if [ "$#" == 0 -o "$#" > 1 ] ; then echo "hello" fi if [ "$#" == 0 ] || [ "$#" > 1 ] ; then echo "hello" fi 

这应该可以。

 if [ "$#" == 0 ] || [ "$#" -gt 1 ] ; then echo "hello" fi 

我不确定这是否与其他shell不同,但是如果你想使用<,>,你需要把它们放在双括号里面,像这样:

 if (("$#" > 1)) ... 

这段代码适用于我:

 #!/bin/sh argc=$# echo $argc if [ $argc -eq 0 -o $argc -eq 1 ]; then echo "foo" else echo "bar" fi 

我不认为sh支持“==”。 使用“=”来比较string和-eq来比较整数。

 man test 

更多细节。

如果你正在使用bash退出码状态$? 作为variables,最好这样做:

 if [ $? -eq 4 -o $? -eq 8 ] ; then echo "..." fi 

因为如果你这样做:

 if [ $? -eq 4 ] || [ $? -eq 8 ] ; then 

OR左边部分改变$? variables,所以OR右边部分没有原来的$? 值。

有时你需要使用双括号,否则你会得到一个错误,如太多的参数

 if [[ $OUTMERGE == *"fatal"* ]] || [[ $OUTMERGE == *"Aborting"* ]] then fi 

你有没有尝试过这样的事情:

 if [ $# -eq 0 ] || [ $# -gt 1 ] then echo "$#" fi 

从Bash参考手册→3.4.2特殊参数


($#)扩展为十进制位置参数的数量。

因此, $#将始终是0或更大的整数。

所以如果你想在$#是0或者大于1时做某事,你只需要检查$#是否为1

 [ $# -eq 1 ] && echo "1 positional param" || echo "0 or more than 1" 

这使用语法:

 [ condition ] && {things if true} || {things if false}