如何在Shell Scripting中执行逻辑OR操作

Str*_*rry 554 unix bash if-statement sh

我正在尝试进行简单的条件检查,但它似乎不起作用.

如果$#等于0或大于1那么打个招呼.

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

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

if [ "$#" == 0 ] || [ "$#" > 1 ] ; then
 echo "hello"
fi
Run Code Online (Sandbox Code Playgroud)

Cod*_*ict 963

这应该工作:

#!/bin/bash

if [ "$#" -eq 0 ] || [ "$#" -gt 1 ] ; then
    echo "hello"
fi
Run Code Online (Sandbox Code Playgroud)

我不确定这在其他shell中是否有所不同但是如果你想使用<,>,你需要将它们放在双括号内,如下所示:

if (("$#" > 1))
 ...
Run Code Online (Sandbox Code Playgroud)

  • 我不确定它在另一个shell中是否有所不同,但在bash中,如果你想使用>或<,你必须将它们放在双括号中,如下所示:(("$ a"<"$ b")) (2认同)

小智 55

这段代码适合我:

#!/bin/sh

argc=$#
echo $argc
if [ $argc -eq 0 -o $argc -eq 1 ]; then
  echo "foo"
else
  echo "bar"
fi
Run Code Online (Sandbox Code Playgroud)

我不认为sh支持"==".使用"="比较字符串和-eq来比较int.

man test
Run Code Online (Sandbox Code Playgroud)

更多细节.

  • 应该是`-gt`大于.或者只用`[$#-ne 1]`替换它. (3认同)

luc*_*a76 33

如果您使用bash退出代码状态$?作为变量,最好这样做:

if [ $? -eq 4 -o $? -eq 8 ] ; then  
   echo "..."
fi
Run Code Online (Sandbox Code Playgroud)

因为如果你这样做:

if [ $? -eq 4 ] || [ $? -eq 8 ] ; then  
Run Code Online (Sandbox Code Playgroud)

OR左边部分改变$?变量,所以OR右边部分没有原始的$?值.

  • $# 返回传递给脚本的参数数量。用于检查正确使用。提问者似乎没有使用退出代码。 (2认同)

小智 26

有时您需要使用双括号,否则会出现类似于太多参数的错误

if [[ $OUTMERGE == *"fatal"* ]] || [[ $OUTMERGE == *"Aborting"* ]]
  then
fi
Run Code Online (Sandbox Code Playgroud)

  • 这很有用,因为这是我在这里看到的唯一显示非整数比较示例的内容,它们在语法上略有不同。 (3认同)

小智 12

如果是bash脚本

If [[ $input -gt number  ||  $input  -lt number  ]]
then 
    echo .........
else
    echo .........

fi

exit
Run Code Online (Sandbox Code Playgroud)


Joh*_*ker 7

你试过这样的事情:

if [ $# -eq 0 ] || [ $# -gt 1 ] 
then
 echo "$#"
fi
Run Code Online (Sandbox Code Playgroud)


fed*_*qui 5

来自Bash 参考手册?3.4.2 特殊参数

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

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

因此,如果您想在$#0 或大于 1时执行某些操作,则只需检查$#is 或 is not 1

[ $# -eq 1 ] && echo "1 positional param" || echo "0 or more than 1"
Run Code Online (Sandbox Code Playgroud)

这使用语法:

[ condition ] && {things if true} || {things if false}
Run Code Online (Sandbox Code Playgroud)