Linux Shell 比较运算有哪些,以及怎么用

在 Linux Shell 脚本编程中,进行算术比较是常见的需求,特别是在编写条件判断语句时。Shell 提供了一系列的算术比较操作符,这些操作符通常用在 ifwhile 等语句中,以便进行数值比较。下面介绍一些常用的算术比较操作符和它们的用法。

算术比较操作符

  • -eq:等于。如果两个数相等,则返回 true。
    • 用法示例:if [ $a -eq $b ]
  • -ne:不等于。如果两个数不相等,则返回 true。
    • 用法示例:if [ $a -ne $b ]
  • -gt:大于。如果左边的数大于右边的数,则返回 true。
    • 用法示例:if [ $a -gt $b ]
  • -ge:大于等于。如果左边的数大于或等于右边的数,则返回 true。
    • 用法示例:if [ $a -ge $b ]
  • -lt:小于。如果左边的数小于右边的数,则返回 true。
    • 用法示例:if [ $a -lt $b ]
  • -le:小于等于。如果左边的数小于或等于右边的数,则返回 true。
    • 用法示例:if [ $a -le $b ]

示例 1:比较两个数的大小

#!/bin/bash

a=10
b=20

if [ $a -lt $b ]; then
    echo "$a 小于 $b"
elif [ $a -gt $b ]; then
    echo "$a 大于 $b"
else
    echo "$a 等于 $b"
fi

这个脚本会输出 “10 小于 20”,因为在这个例子中,a 的确是小于 b 的。

示例 2:检查数值是否相等

#!/bin/bash

num1=100
num2=100

if [ $num1 -eq $num2 ]; then
    echo "两个数相等"
else
    echo "两个数不相等"
fi

这个脚本会输出 “两个数相等”,因为 num1num2 的值都是 100。

示例 3:每个算术比较操作符的具体用法如下:

  • 等于 (-eq)

    if [ $a -eq $b ]; then
        echo "$a 等于 $b"
    fi
    
  • 不等于 (-ne)

    if [ $a -ne $b ]; then
        echo "$a 不等于 $b"
    fi
    
  • 大于 (-gt)

    if [ $a -gt $b ]; then
        echo "$a 大于 $b"
    fi
    
  • 大于等于 (-ge)

    if [ $a -ge $b ]; then
        echo "$a 大于等于 $b"
    fi
    
  • 小于 (-lt)

    if [ $a -lt $b ]; then
        echo "$a 小于 $b"
    fi
    
  • 小于等于 (-le)

    if [ $a -le $b ]; then
        echo "$a 小于等于 $b"
    fi
    

小技巧

  • 使用算术比较操作符时,确保比较的变量值是数字。
  • 如果需要进行复杂的数学计算,可以使用 expr 命令或者双括号 ((...)) 来执行。

逻辑运算符

-o(逻辑或)和 -a(逻辑与)这两个在 Shell 脚本中用于控制流的逻辑操作符。这些操作符允许我们在同一个条件语句中结合多个条件判断,为脚本的逻辑控制提供了更大的灵活性。

-o 逻辑或(OR)

当给定的两个条件中至少一个条件为 true 时,-o 操作符会返回 true。这在需要满足多个条件之一的情况下非常有用。

  • 用法示例:检查两个变量中至少一个等于给定值的情况。
    if [ $a -eq 5 -o $b -eq 10 ]; then
        echo "至少一个条件满足"
    fi
    

-a 逻辑与(AND)

只有当给定的所有条件都为 true 时,-a 操作符才会返回 true。这适用于需要同时满足多个条件的情况。

  • 用法示例:同时检查两个变量是否分别等于特定的值。
    if [ $a -eq 5 -a $b -eq 10 ]; then
        echo "两个条件均满足"
    fi
    

逻辑操作符示例

下面的示例展示了如何使用 -a-o 逻辑操作符来组合多个条件。

#!/bin/bash

# 设置变量
a=1
b=2

# 使用 -a 操作符
if [ $a -eq 1 -a $b -eq 2 ]; then
    echo "两个条件均满足"
fi

# 使用 -o 操作符
if [ $a -eq 1 -o $b -eq 3 ]; then
    echo "至少一个条件满足"
fi

在这个示例中,第一个 if 语句使用 -a 操作符来检查 $a 是否等于 1 且 $b 是否等于 2。第二个 if 语句使用 -o 操作符来检查 $a 是否等于 1 或 $b 是否等于 3。根据这些条件,相应的消息将被输出到控制台。

文件系统比较运算符

  • [ -e $var ]:检查文件是否存在。如果文件(或目录)存在,则条件为真。
    • 用法示例:if [ -e $filename ]; then echo "文件存在"; fi
  • [ -r $var ]:检查文件是否存在且可读。如果文件存在且对当前用户或脚本可读,则条件为真。
    • 用法示例:if [ -r $filename ]; then echo "文件可读"; fi
  • [ -w $var ]:检查文件是否存在且可写。如果文件存在且对当前用户或脚本可写,则条件为真。
    • 用法示例:if [ -w $filename ]; then echo "文件可写"; fi
  • [ -x $var ]:检查文件是否存在且可执行。如果文件存在且对当前用户或脚本可执行,则条件为真。
    • 用法示例:if [ -x $filename ]; then echo "文件可执行"; fi
  • [ -s $var ]:检查文件是否存在且其大小大于零。如果文件存在且其大小大于零,则条件为真。
    • 用法示例:if [ -s $filename ]; then echo "文件非空"; fi
  • [ -d $var ]:检查文件(指定路径)是否存在且为一个目录。如果所指定的文件存在且为一个目录,则条件为真。
    • 用法示例:if [ -d $dirname ]; then echo "目录存在"; fi

字符串比较

使用字符串进行比较时,最好用双中括号,因为有时候采用单个中括号会产生错误,所以最好避开它们。

在 Shell 脚本中,字符串比较是处理文本数据的重要方面。下面是对前面提到的字符串比较运算符的详细说明。

  • [[ $str1 = $str2 ]][[ $str1 == $str2 ]]:检查两个字符串是否相等。如果相等,则条件为真。
    • 用法示例:if [[ $str1 == $str2 ]]; then echo "字符串相等"; fi
  • [[ -z $str1 ]]:检查字符串变量 $str1 是否为空(长度为零)。如果为空,则条件为真。
    • 用法示例:if [[ -z $str1 ]]; then echo "字符串为空"; fi
  • [[ -n $str1 ]]:检查字符串变量 $str1 是否非空(长度大于零)。如果非空,则条件为真。
    • 用法示例:if [[ -n $str1 ]]; then echo "字符串非空"; fi
  • [[ $str1 = s*a ]]:检查字符串 $str1 是否匹配模式 s*a,其中 * 表示任意数量的任意字符。如果匹配,则条件为真。
    • 用法示例:if [[ $str1 = s*a ]]; then echo "字符串匹配"; fi

可以用test命令执行条件检测,有助于避免使用过多括号

virde@virde:~$ str1=""
virde@virde:~$ test -z $str1 && echo "str1 is empty"
str1 is empty
virde@virde:~$ [[ -z $str1 ]] && echo "str1 is empty"
str1 is empty
virde@virde:~$ 

参考链接

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐