linux shell 编程:整数比较详解 作者:马育民 • 2026-09-25 07:43 • 阅读:10001 # 介绍 **整数比较只能对比数字**,不能直接比较字符串 有下面三种写法,语法不一样,很容易混淆: - `[]` - `[[]]` - `(( ))` 适用:`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"` 防止空值报错 ```bash #!/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 ```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` 那套。 变量可以不加 `$`。 ```bash 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` 或者;**推荐外面用 && ||** ```bash # 推荐写法 if [ "$a" -gt 5 ] && [ "$a" -lt 20 ]; then echo "5 < a <20" fi ``` ### [[]]用法 `[[ ]]` 里面:`&&` 并且,`||` 或者 ```bash if [[ $a -gt 5 && $a -lt 20 ]]; then echo "5 < a <20" fi ``` ### (())用法 `(( ))` 里面:`&&` 并且,`||` 或者 ```bash if (( a >5 && a <20 )); then echo "5 < a <20" fi ``` # 常见坑点总结 ### 1. **整数 vs 字符串比较区分** - `[ ]` / `[[ ]]`:`-eq/-gt` → 数字;`>` `<` → 字符串比较 - `(( ))`:全部是算术整数比较 ```bash # 坑示例 [[ 100 > 20 ]] # 字符串比较:字符'1' < '2' → false (( 100 > 20 )) # 整数比较 → true ``` ### 2. **变量为空/未定义** ```bash a="" [ $a -gt 5 ] # 报错!空值,建议 [ "$a" -gt 5 ] 加引号 ``` ### 3. **不能比较小数** shell原生只支持整数,小数比较要用 `awk`/`bc` ```bash # 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