本文目录导读:

在Shell脚本中,条件执行和判断结果主要通过条件判断语句和逻辑运算符来实现,以下是完整的指南:
基础条件判断语法
if-else 语句
#!/bin/bash
if [ condition ]; then
# 条件成立时执行
elif [ condition2 ]; then
# 条件2成立时执行
else
# 所有条件都不成立时执行
fi
条件表达式类型
文件测试
if [ -f "file.txt" ]; then # 判断是否是普通文件
echo "是普通文件"
fi
if [ -d "directory" ]; then # 判断是否是目录
echo "是目录"
fi
if [ -e "path" ]; then # 判断路径是否存在
echo "路径存在"
fi
if [ -s "file" ]; then # 文件非空
echo "文件非空"
fi
字符串比较
if [ "$str1" = "$str2" ]; then # 字符串相等(注意:单个=)
echo "相等"
fi
if [ "$str1" != "$str2" ]; then # 字符串不相等
echo "不相等"
fi
if [ -z "$str" ]; then # 字符串为空
echo "空字符串"
fi
if [ -n "$str" ]; then # 字符串非空
echo "非空字符串"
fi
数字比较
if [ "$num1" -eq "$num2" ]; then # 等于
echo "相等"
fi
if [ "$num1" -ne "$num2" ]; then # 不等于
echo "不相等"
fi
if [ "$num1" -gt "$num2" ]; then # 大于
echo "大于"
fi
if [ "$num1" -lt "$num2" ]; then # 小于
echo "小于"
fi
if [ "$num1" -ge "$num2" ]; then # 大于等于
echo "大于等于"
fi
if [ "$num1" -le "$num2" ]; then # 小于等于
echo "小于等于"
fi
逻辑运算符
AND(与)
# 方式1:-a 或 &&
if [ condition1 -a condition2 ]; then
echo "两个条件都成立"
fi
# 方式2:使用双中括号
if [[ condition1 && condition2 ]]; then
echo "两个条件都成立"
fi
OR(或)
# 方式1:-o 或 ||
if [ condition1 -o condition2 ]; then
echo "至少一个条件成立"
fi
# 方式2:使用双中括号
if [[ condition1 || condition2 ]]; then
echo "至少一个条件成立"
fi
NOT(非)
if [ ! condition ]; then
echo "条件不成立"
fi
命令执行结果判断
使用 $? 判断命令退出状态
# 检查命令是否成功执行
ls /etc/passwd
if [ $? -eq 0 ]; then
echo "命令执行成功"
else
echo "命令执行失败"
fi
直接使用命令作为条件
# 命令成功执行(退出码为0)则条件为真
if ls /etc/passwd > /dev/null 2>&1; then
echo "文件存在"
fi
# 使用 grep
if grep -q "pattern" file.txt; then
echo "找到匹配"
fi
高级条件写法
使用双中括号 [[]](推荐)
# 支持正则匹配
if [[ $str =~ ^[0-9]+$ ]]; then
echo "全是数字"
fi
# 支持模式匹配
if [[ $filename == *.txt ]]; then
echo "是txt文件"
fi
# 更安全的字符串比较
if [[ $var == "" ]]; then
echo "变量为空"
fi
算术比较
# 使用 (( )) 进行算术运算
if (( num1 > num2 )); then
echo "$num1 大于 $num2"
fi
# 复合条件
if (( num1 > 10 && num2 < 20 )); then
echo "两个条件都满足"
fi
case 多分支判断
case $variable in
pattern1)
# 匹配pattern1
;;
pattern2|pattern3)
# 匹配pattern2或pattern3
;;
[0-9]*)
# 以数字开头
;;
*)
# 默认情况
;;
esac
实际示例
#!/bin/bash
# 判断文件并执行操作
check_and_run() {
local file=$1
# 使用多个条件的复合判断
if [[ -f "$file" && -r "$file" ]]; then
echo "文件可读"
# 检查文件大小
if [[ -s "$file" ]]; then
echo "文件非空,处理中..."
# 执行命令并判断结果
if wc -l "$file" > /dev/null 2>&1; then
lines=$(wc -l < "$file")
echo "文件行数: $lines"
fi
else
echo "文件为空"
fi
elif [[ ! -e "$file" ]]; then
echo "文件不存在"
else
echo "文件存在但不可读"
fi
}
# 调用函数
check_and_run "/etc/passwd"
最佳实践建议
- 变量引用:总是用双引号包裹变量
"$var" - 推荐使用[[]]代替,功能更强大且更安全
- 退出状态:
0为成功,非0为失败 - 调试技巧:
set -x # 开启调试模式 # ... 脚本代码 ... set +x # 关闭调试模式
这样你就可以在Shell脚本中灵活地进行条件执行和结果判断了。