Shell脚本如何条件执行并判断结果

wen 实用脚本 1

本文目录导读:

Shell脚本如何条件执行并判断结果

  1. 基础条件判断语法
  2. 条件表达式类型
  3. 逻辑运算符
  4. 命令执行结果判断
  5. 高级条件写法
  6. case 多分支判断
  7. 实际示例
  8. 最佳实践建议

在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"

最佳实践建议

  1. 变量引用:总是用双引号包裹变量 "$var"
  2. 推荐使用[[]]代替,功能更强大且更安全
  3. 退出状态0为成功,非0为失败
  4. 调试技巧
    set -x  # 开启调试模式
    # ... 脚本代码 ...
    set +x  # 关闭调试模式

这样你就可以在Shell脚本中灵活地进行条件执行和结果判断了。

抱歉,评论功能暂时关闭!