比较运算符 #
一、数值比较运算符 #
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