在 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 脚本的基础。根据不同的比较需求选择合适的运算符和语法结构,可以使脚本更加健壮和可读。