linux shell 编程:整数比较详解

介绍

整数比较只能对比数字,不能直接比较字符串

有下面三种写法,语法不一样,很容易混淆:

  • []
  • [[]]
  • (( ))

适用:bash/sh,整数(int),不是浮点数(小数不能直接比较)

三种常用语法总览

写法 整数比较运算符 特点
[ 表达式 ] (POSIX 标准,兼容所有sh) -eq -ne -gt -ge -lt -le 必须空格;不能用 > <(会被当成重定向)
[[ 表达式 ]](bash扩展) -eq -ne -gt -ge -lt -le 容错更好,支持逻辑&& \ \ ,但>默认是字符串比较
(( 表达式 ))(bash算术运算,最推荐整数比较) == != > >= < <= 类C语法,直观,不需要 - 开头参数

写法一:[ ] / [[ ]] 用法

整数比较符号含义

参数 英文全称 含义
-eq equal 等于 ==
-ne not equal 不等于 !=
-gt greater than 大于 >
-ge greater or equal 大于等于 >=
-lt less than 小于 <
-le less or equal 小于等于 <=

重点:[ $a > $b ] 在单中括号里,不是大于,而是文件重定向!一定要写 -gt


例子:[ ] POSIX 写法(可移植)

注意:[ 是命令,前后必须有空格,变量建议双引号 "$var" 防止空值报错

#!/bin/bash
a=10
b=20

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

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

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

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

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

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

例子:[[ ]] bash 双中括号

[[ ]] 是bash内置,容错更强,支持 && || 直接写在里面,整数依旧用 -eq/-gt

注意:适用于bash

a=10
b=20
if [[ $a -lt $b && $b -le 30 ]]; then
  echo "满足条件"
fi

注意:[[ $a > $b ]] 不加 - 时,是字符串字典序比较,不是数字!

例:[[ 100 > 20 ]] 字符串比较结果为 false,因为字符1<2,这是高频踩坑点。

写法二:(( )) 双圆括号

整数比较首选,类C语法

只在bash可用,专门做算术运算与整数判断,直接用 > < >= <= == !=,不用 -eq 那套。
变量可以不加 $。

a=10
b=20

if (( a == b )); then
  echo "相等"
fi

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

if (( a > b )); then
  echo "a大于b"
fi

if (( a >= 5 && b <= 30 )); then
  echo "复合条件"
fi

✅ 优点:写法直观,符合编程习惯;
❌ 缺点:不是POSIX标准,sh 不支持,只能bash。

逻辑组合(多条件)

[]用法

[ ] 里面:-a 并且,-o 或者;推荐外面用 && ||

# 推荐写法
if [ "$a" -gt 5 ] && [ "$a" -lt 20 ]; then
  echo "5 < a <20"
fi

[[]]用法

[[ ]] 里面:&& 并且,|| 或者

if [[ $a -gt 5 && $a -lt 20 ]]; then
  echo "5 < a <20"
fi

(())用法

(( )) 里面:&& 并且,|| 或者

if (( a >5 && a <20 )); then
  echo "5 < a <20"
fi

常见坑点总结

1. 整数 vs 字符串比较区分

  • [ ] / [[ ]]:-eq/-gt → 数字;> < → 字符串比较
  • (( )):全部是算术整数比较
    # 坑示例
    [[ 100 > 20 ]]   # 字符串比较:字符'1' < '2' → false
    (( 100 > 20 ))   # 整数比较 → true
    

    2. 变量为空/未定义

    a=""
    [ $a -gt 5 ] # 报错!空值,建议 [ "$a" -gt 5 ] 加引号
    

    3. 不能比较小数

    shell原生只支持整数,小数比较要用 awk/bc
    # bc 比较浮点数示例
    a=3.5
    b=2.1
    if (( $(echo "$a > $b" | bc -l) )); then
    echo "a更大"
    fi
    

    4. 空格!空格!

    [ 1 -eq 2 ] 空格不能少;[1 -eq 2] 直接语法错误。

选型建议

  • 脚本要兼容 /bin/sh,跨多种Linux:用 [ ] + -eq/-gt
  • 只跑bash,代码简洁写整数判断:优先 (( ))
  • 混合字符串+整数判断:[[ ]]

企业使用

  • 老脚本、传统运维脚本:大量用 [ ] + -eq/-gt/-lt
  • 新脚本、开发人员写的脚本:优先 (( ))
  • [[ ]] 字符串比较强,整数比较一般不用它。

原文出处:/show_1GW46uR8Q98r.html