1. Shell脚本中的条件测试基础
在Shell编程中,条件测试是构建逻辑分支的核心机制。不同于其他编程语言使用布尔值直接判断,Shell通过退出状态码(exit status)来评估条件是否成立。每个命令执行后都会返回0-255之间的状态码,其中0表示成功(true),非0表示失败(false)。
测试命令主要有两种形式:
- test命令:
test expression - 方括号语法:
[ expression ](注意括号内侧必须有空格)
现代Shell还支持双括号语法[[ expression ]],它提供了更强大的功能且不需要严格空格限制。例如字符串比较时不需要引号也能正确处理含空格的情况:
bash复制if [[ $name == John Doe ]]; then # 无需引号
echo "Name matched"
fi
文件测试是Shell特有的强大功能,可以检查文件属性:
bash复制if [ -f "/path/to/file" ]; then # 检查常规文件是否存在
echo "File exists"
elif [ -d "/path/to/dir" ]; then # 检查目录
echo "Directory found"
fi
注意:在条件测试中,变量引用最好总是加双引号,避免变量为空或含空格时出现语法错误。例如
[ "$var" = "value" ]比[ $var = "value" ]更安全。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 条件测试的数值与字符串比较
2.1 数值比较操作符
Shell使用特定的操作符进行数值比较(与大多数编程语言不同):
-eq:等于(equal)-ne:不等于(not equal)-gt:大于(greater than)-lt:小于(less than)-ge:大于等于(greater or equal)-le:小于等于(less or equal)
典型示例:
bash复制if [ "$a" -gt "$b" ]; then
echo "$a is greater than $b"
fi
在双括号(( ))中可以使用更熟悉的数学比较符号(>, <, ==等):
bash复制if (( a > b )); then # 不需要$符号
echo "Math comparison works"
fi
2.2 字符串比较要点
字符串比较使用不同的操作符:
=或==:相等(在[]和[[]]中都可用)!=:不相等>和<:按字典顺序比较(仅在[[]]中有效)-z:字符串为空-n:字符串非空
关键区别示例:
bash复制str1="hello"
str2="world"
if [ "$str1" = "$str2" ]; then # 使用单个=号
echo "Strings are equal"
elif [[ $str1 < $str2 ]]; then # 双括号允许直接使用< >
echo "$str1 comes before $str2"
fi
实际经验:字符串比较时,
[[]]比[]更安全且功能更强。例如[[ $var == *.txt ]]可以直接做模式匹配,而[]需要借助外部命令如test。
3. 复合条件与逻辑运算符
3.1 逻辑组合方式
Shell提供三种逻辑运算符:
-a:AND(在[]中使用)-o:OR(在`[
