比较运算符 #

一、数值比较运算符 #

1.1 数值比较符 #

运算符 说明 示例
-eq 等于 [ $a -eq $b ]
-ne 不等于 [ $a -ne $b ]
-gt 大于 [ $a -gt $b ]
-ge 大于等于 [ $a -ge $b ]
-lt 小于 [ $a -lt $b ]
-le 小于等于 [ $a -le $b ]

1.2 基本使用 #

bash
#!/bin/bash

a=10
b=5

# 等于
if [ $a -eq $b ]; then
    echo "$a 等于 $b"
else
    echo "$a 不等于 $b"
fi

# 大于
if [ $a -gt $b ]; then
    echo "$a 大于 $b"
fi

# 小于
if [ $b -lt $a ]; then
    echo "$b 小于 $a"
fi

# 大于等于
if [ $a -ge 10 ]; then
    echo "$a 大于等于 10"
fi

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

1.3 使用 (()) 进行数值比较 #

bash
#!/bin/bash

a=10
b=5

# 使用 (()) 更直观
if (( a > b )); then
    echo "$a 大于 $b"
fi

if (( a == 10 )); then
    echo "a 等于 10"
fi

if (( a != b )); then
    echo "$a 不等于 $b"
fi

if (( a >= 10 )); then
    echo "$a 大于等于 10"
fi

if (( b <= 5 )); then
    echo "$b 小于等于 5"
fi

1.4 数值比较符对比 #

写法 说明 推荐度
[ $a -eq $b ] 传统写法 ★★★☆☆
[[ $a -eq $b ]] 增强写法 ★★★★☆
(( a == b )) 算术写法 ★★★★★

二、字符串比较运算符 #

2.1 字符串比较符 #

运算符 说明 示例
= 相等 [ “$a” = “$b” ]
!= 不相等 [ “$a” != “$b” ]
-z 长度为零 [ -z “$a” ]
-n 长度非零 [ -n “$a” ]
< 小于(ASCII) [[ “$a” < “$b” ]]
> 大于(ASCII) [[ “$a” > “$b” ]]

2.2 字符串相等比较 #

bash
#!/bin/bash

str1="hello"
str2="world"
str3="hello"

# 相等比较
if [ "$str1" = "$str3" ]; then
    echo "str1 等于 str3"
fi

# 不相等比较
if [ "$str1" != "$str2" ]; then
    echo "str1 不等于 str2"
fi

# 使用 [[ ]](推荐)
if [[ "$str1" == "$str3" ]]; then
    echo "str1 等于 str3"
fi

2.3 字符串长度判断 #

bash
#!/bin/bash

str=""
name="张三"

# 判断为空
if [ -z "$str" ]; then
    echo "str 为空"
fi

# 判断非空
if [ -n "$name" ]; then
    echo "name 非空: $name"
fi

# 另一种判断方式
if [ "$str" ]; then
    echo "str 非空"
else
    echo "str 为空"
fi

2.4 字符串大小比较 #

bash
#!/bin/bash

str1="apple"
str2="banana"

# 使用 [[ ]] 进行字典序比较
if [[ "$str1" < "$str2" ]]; then
    echo "$str1 在字典序上小于 $str2"
fi

if [[ "$str2" > "$str1" ]]; then
    echo "$str2 在字典序上大于 $str1"
fi

# 注意:在 [ ] 中需要转义
if [ "$str1" \< "$str2" ]; then
    echo "$str1 小于 $str2"
fi

三、test命令详解 #

3.1 test命令格式 #

bash
# 格式一:test
test $a -eq $b && echo "相等"

# 格式二:[ ]
[ $a -eq $b ] && echo "相等"

# 格式三:[[ ]]
[[ $a -eq $b ]] && echo "相等"

3.2 [ ] 与 [[ ]] 的区别 #

bash
#!/bin/bash

# [ ] 是传统命令
# - 变量需要加引号
# - < > 需要转义
# - 不支持 && ||

a="hello world"

# 正确写法
[ "$a" = "hello world" ]

# 错误写法(变量未加引号)
# [ $a = "hello world" ]  # 报错:参数过多

# [[ ]] 是Bash增强语法
# - 变量可不加引号(但仍建议加)
# - < > 不需要转义
# - 支持 && ||

# 正确写法
[[ $a = "hello world" ]]
[[ "$a" = "hello world" ]]

# 支持逻辑运算
[[ $a = "hello" || $a = "world" ]]

3.3 推荐使用 [[ ]] #

bash
#!/bin/bash

# 推荐:使用 [[ ]]
a="hello world"

# 模式匹配
if [[ "$a" == hello* ]]; then
    echo "以hello开头"
fi

# 正则匹配
if [[ "$a" =~ ^hello ]]; then
    echo "匹配正则表达式"
fi

# 逻辑组合
if [[ "$a" == "hello"* && ${#a} -gt 5 ]]; then
    echo "以hello开头且长度大于5"
fi

四、组合比较 #

4.1 逻辑运算符 #

运算符 说明 示例
&& 逻辑与 [[ $a -gt 0 && $a -lt 10 ]]
|| 逻辑或 [[ $a -lt 0 || $a -gt 10 ]]
! 逻辑非 [[ ! $a -eq 0 ]]

4.2 使用 [[ ]] 组合 #

bash
#!/bin/bash

age=25
score=85

# 逻辑与
if [[ $age -ge 18 && $age -le 60 ]]; then
    echo "年龄在18-60之间"
fi

# 逻辑或
if [[ $score -lt 60 || $score -gt 100 ]]; then
    echo "成绩异常"
fi

# 逻辑非
if [[ ! $score -lt 60 ]]; then
    echo "成绩及格"
fi

# 复杂组合
if [[ ($age -ge 18 && $age -le 60) && $score -ge 60 ]]; then
    echo "符合条件"
fi

4.3 使用 [ ] 组合 #

bash
#!/bin/bash

a=5
b=10

# 使用 -a (AND)
if [ $a -gt 0 -a $b -gt 0 ]; then
    echo "a和b都大于0"
fi

# 使用 -o (OR)
if [ $a -gt 10 -o $b -gt 5 ]; then
    echo "a大于10或b大于5"
fi

# 使用 ! (NOT)
if [ ! $a -eq 0 ]; then
    echo "a不等于0"
fi

4.4 推荐写法 #

bash
#!/bin/bash

# 推荐:使用 [[ ]] 和 && ||
if [[ $a -gt 0 && $b -gt 0 ]]; then
    echo "推荐写法"
fi

# 或者使用单独的条件
if [ $a -gt 0 ] && [ $b -gt 0 ]; then
    echo "另一种推荐写法"
fi

# 不推荐:使用 -a -o
if [ $a -gt 0 -a $b -gt 0 ]; then
    echo "不推荐写法"
fi

五、实战示例 #

5.1 数字范围判断 #

bash
#!/bin/bash

check_range() {
    local num=$1
    local min=$2
    local max=$3
    
    if (( num >= min && num <= max )); then
        echo "$num 在 [$min, $max] 范围内"
        return 0
    else
        echo "$num 不在 [$min, $max] 范围内"
        return 1
    fi
}

check_range 5 1 10
check_range 15 1 10

5.2 字符串验证 #

bash
#!/bin/bash

validate_input() {
    local input="$1"
    
    # 检查是否为空
    if [[ -z "$input" ]]; then
        echo "错误:输入不能为空"
        return 1
    fi
    
    # 检查长度
    if (( ${#input} < 3 )); then
        echo "错误:输入长度不能少于3个字符"
        return 1
    fi
    
    # 检查是否为纯数字
    if [[ "$input" =~ ^[0-9]+$ ]]; then
        echo "输入是纯数字"
        return 0
    fi
    
    # 检查是否为纯字母
    if [[ "$input" =~ ^[a-zA-Z]+$ ]]; then
        echo "输入是纯字母"
        return 0
    fi
    
    echo "输入是混合字符"
    return 0
}

validate_input ""
validate_input "ab"
validate_input "123"
validate_input "abc"
validate_input "abc123"

5.3 成绩等级判断 #

bash
#!/bin/bash

get_grade() {
    local score=$1
    
    if (( score < 0 || score > 100 )); then
        echo "无效成绩"
        return 1
    fi
    
    if (( score >= 90 )); then
        echo "优秀"
    elif (( score >= 80 )); then
        echo "良好"
    elif (( score >= 70 )); then
        echo "中等"
    elif (( score >= 60 )); then
        echo "及格"
    else
        echo "不及格"
    fi
}

get_grade 95
get_grade 85
get_grade 75
get_grade 65
get_grade 55

5.4 版本号比较 #

bash
#!/bin/bash

compare_versions() {
    local v1=$1
    local v2=$2
    
    # 将版本号拆分为数组
    IFS='.' read -ra arr1 <<< "$v1"
    IFS='.' read -ra arr2 <<< "$v2"
    
    # 获取最大长度
    local max_len=${#arr1[@]}
    (( ${#arr2[@]} > max_len )) && max_len=${#arr2[@]}
    
    # 逐段比较
    for (( i=0; i<max_len; i++ )); do
        local num1=${arr1[i]:-0}
        local num2=${arr2[i]:-0}
        
        if (( num1 > num2 )); then
            echo "$v1 > $v2"
            return 0
        elif (( num1 < num2 )); then
            echo "$v1 < $v2"
            return 0
        fi
    done
    
    echo "$v1 = $v2"
}

compare_versions "1.2.3" "1.2.4"
compare_versions "2.0.0" "1.9.9"
compare_versions "1.0" "1.0.0"

六、比较运算符速查表 #

6.1 数值比较 #

运算符 说明 示例
-eq 等于 [ $a -eq $b ]
-ne 不等于 [ $a -ne $b ]
-gt 大于 [ $a -gt $b ]
-ge 大于等于 [ $a -ge $b ]
-lt 小于 [ $a -lt $b ]
-le 小于等于 [ $a -le $b ]
== 等于 (( a == b ))
!= 不等于 (( a != b ))
> 大于 (( a > b ))
>= 大于等于 (( a >= b ))
< 小于 (( a < b ))
<= 小于等于 (( a <= b ))

6.2 字符串比较 #

运算符 说明 示例
= 相等 [ “$a” = “$b” ]
== 相等 [[ “$a” == “$b” ]]
!= 不相等 [ “$a” != “$b” ]
-z 长度为零 [ -z “$a” ]
-n 长度非零 [ -n “$a” ]
< 小于 [[ “$a” < “$b” ]]
> 大于 [[ “$a” > “$b” ]]

七、总结 #

7.1 关键要点 #

  • 数值比较使用 -eq, -ne, -gt, -ge, -lt, -le
  • 字符串比较使用 =, !=, -z, -n
  • 推荐使用 [[ ]] 进行比较
  • 数值比较推荐使用 (( ))
  • 字符串比较记得加引号

7.2 下一步 #

你已经掌握了比较运算符,接下来让我们学习 逻辑运算符,了解Shell中的逻辑操作!

最后更新:2026-03-27