在 Linux shell 脚本编程中,关系运算符用于比较两个值或变量。这些运算符在条件判断、循环控制等场景中非常重要。以下是主要的比较运算符及其使用方法:
这些运算符用于比较整数:
| 运算符 | 描述 | 示例 |
|---|---|---|
| -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=10
b=20
if [ "$a" -lt "$b" ]; then
echo "$a 小于 $b"
fi
这些运算符用于比较字符串:
| 运算符 | 描述 | 示例 |
|---|---|---|
| = | 等于 | [ "$a" = "$b" ] |
| == | 等于(同=) | [ "$a" == "$b" ] |
| != | 不等于 | [ "$a" != "$b" ] |
| < | 小于(按字典序) | [[ "$a" < "$b" ]] |
| > | 大于(按字典序) | [[ "$a" > "$b" ]] |
| -z | 字符串为空 | [ -z "$a" ] |
| -n | 字符串非空 | [ -n "$a" ] |
str1="hello"
str2="world"
if [ "$str1" != "$str2" ]; then
echo "字符串不相等"
fi
这些运算符用于测试文件属性:
| 运算符 | 描述 | 示例 |
|---|---|---|
| -e | 文件存在 | [ -e "file" ] |
| -f | 是普通文件(非目录/设备) | [ -f "file" ] |
| -d | 是目录 | [ -d "dir" ] |
| -s | 文件大小不为零 | [ -s "file" ] |
| -r | 文件可读 | [ -r "file" ] |
| -w | 文件可写 | [ -w "file" ] |
| -x | 文件可执行 | [ -x "file" ] |
| -L | 是符号链接 | [ -L "file" ] |
if [ -f "/etc/passwd" ]; then
echo "/etc/passwd 是一个普通文件"
fi
用于组合多个条件:
| 运算符 | 描述 | 示例 |
|---|---|---|
| ! | 非 | [ ! "$a" -eq "$b" ] |
| -a | 与 | [ "$a" -eq "$b" -a "$c" -eq "$d" ] |
| -o | 或 | [ "$a" -eq "$b" -o "$c" -eq "$d" ] |
在 [[ ]] 或 (( )) 中可以使用更直观的:
- && 代替 -a
- || 代替 -o
if [ "$a" -gt 10 -a "$a" -lt 20 ]; then
echo "a 在 10 和 20 之间"
fi
双括号 (( )) - 用于算术比较
if (( a > b )); then
echo "a 大于 b"
fi
双中括号 [[ ]] - 增强版的 [ ],支持更多特性
if [[ "$str" == h* ]]; then
echo "字符串以 h 开头"
fi
[ ] 中,变量引用最好用双引号括起来,防止空值或含空格的值导致语法错误[[ ]] 中,可以不使用引号,因为它能更好地处理空值和空格= 和 == 在 [ ] 中是相同的,但在 [[ ]] 中 == 支持模式匹配(( )) 语法,更直观且不需要转义#!/bin/bash
# 检查参数数量
if [ "$#" -ne 2 ]; then
echo "用法: $0 数字1 数字2"
exit 1
fi
# 比较两个数字
if (( $1 > $2 )); then
echo "$1 大于 $2"
elif (( $1 == $2 )); then
echo "$1 等于 $2"
else
echo "$1 小于 $2"
fi
# 检查文件是否存在并可读
file="/etc/passwd"
if [ -e "$file" -a -r "$file" ]; then
echo "$file 存在且可读"
else
echo "$file 不存在或不可读"
fi
掌握这些关系运算符和比较方法是编写有效 shell 脚本的基础。根据不同的比较需求选择合适的运算符和语法结构,可以使脚本更加健壮和可读。