在 Linux 的 shell 脚本中,关系运算符(如 -eq
, -lt
, -gt
等)的作用域主要取决于它们所在的测试上下文。以下是详细说明:
关系运算符的作用域通常由以下两种测试结构决定:
test
命令或 [ ]
结构if [ "$a" -eq "$b" ]; then # 关系运算符在 [ ] 内生效
echo "Equal"
fi
[ ]
或 test
的表达式内有效,超出则报错。(( ))
结构(算术运算)if (( a == b )); then # 使用数学运算符 ==,而非 -eq
echo "Equal"
fi
(( ))
内使用 ==
、!=
等数学运算符,而非 -eq
。运算符 | 含义 | 适用上下文 |
---|---|---|
-eq |
等于 | [ ] 或 test |
-ne |
不等于 | [ ] 或 test |
-lt |
小于 | [ ] 或 test |
-le |
小于等于 | [ ] 或 test |
-gt |
大于 | [ ] 或 test |
-ge |
大于等于 | [ ] 或 test |
== |
等于(字符串) | [ ] 或 [[ ]] |
!= |
不等于(字符串) | [ ] 或 [[ ]] |
a=5
b=10
if [ "$a" -lt "$b" ]; then # -lt 在 [ ] 内有效
echo "a is smaller"
fi
a=5
b=10
if "$a" -lt "$b"; then # 错误:-lt 未包裹在 [ ] 或 test 中
echo "This will fail!"
fi
报错:bash: 5: command not found
[[ ]]
和 `(( )))[[ ]]
:支持更灵活的表达式(如正则匹配),但关系运算符仍需在内部使用。
if [[ "$a" -le "$b" ]]; then
echo "a <= b"
fi
(( ))
:专用于算术比较,使用数学运算符(如 ==
, >
)。
if (( a > b )); then
echo "a > b"
fi
变量引用:在 [ ]
或 test
中,变量建议用双引号包裹(避免空值错误)。
if [ "$var" -eq 0 ]; then # 正确
if [ $var -eq 0 ]; then # 若 var 为空会报错
空格要求:运算符两侧必须留空格。
[ "$a"-eq"$b" ] # 错误!需写成 [ "$a" -eq "$b" ]
上下文 | 支持的运算符 | 作用域范围 |
---|---|---|
[ ] |
-eq , -ne , -lt 等 |
仅在表达式内 |
[[ ]] |
-eq , == , != 等 |
仅在表达式内 |
(( )) |
== , > , < 等 |
仅在表达式内 |
正确使用作用域能避免语法错误,确保脚本逻辑清晰。