shell脚本分支语句

Shell 条件语句详解

在 Shell 脚本编程中,条件判断是控制程序流程的核心。本章节将详细讲解两种常用的条件语句:if...then...ficase...esac

1. if...then...fi 语句

if...then...fi 是 Shell 中最基本的条件判断结构,用于根据条件表达式的真假执行不同的命令。

语法结构
bash 复制代码
if [ 条件表达式 ]
then
    # 条件为真时执行的命令表
    命令1
    命令2
    ...
fi
  • iffi: 必须成对出现,分别标记条件语句的开始和结束。
  • [ 条件表达式 ] : 方括号 [ ]test 命令的简写,用于评估条件。表达式与方括号之间必须有空格。
  • then: 位于条件表达式之后,表示条件为真时要执行的代码块的开始。
  • 命令表 : 位于 thenfi 之间,可以包含一条或多条命令。
执行逻辑
  1. 评估 if 后面的条件表达式。
  2. 如果表达式为真(返回状态码 0),则执行 thenfi 之间的所有命令。
  3. 如果表达式为假(返回非零状态码),则跳过 then 块,直接执行 fi 后面的语句。
示例
bash 复制代码
#!/bin/bash

read -p "请输入一个数字: " num

if [ $num -gt 10 ]
then
    echo "您输入的数字大于 10。"
fi

echo "判断结束。"

运行结果:

  • 输入 15,输出:您输入的数字大于 10。判断结束。
  • 输入 5,输出:判断结束。

2. case...esac 语句

case...esac 是一种多路分支选择语句,非常适合根据一个变量的不同取值执行不同的代码块,比多个 if-elif 语句更清晰。

语法结构
bash 复制代码
case 字符串变量 in
    模式1)
        命令表1
        ;;
    模式2 | 模式3)
        命令表2
        ;;
    ...
    模式n)
        命令表n
        ;;
    *)
        默认命令表
        ;;
esac
  • caseesac: 必须成对出现,分别标记多路分支语句的开始和结束。
  • 字符串变量: 被匹配的变量或值。
  • 模式) : 每个分支以模式结束,模式可以包含通配符(如 *, ?, [ ])。多个模式可以用 | 连接表示"或"关系。
  • ;; : 双分号是每个分支的终止符,表示该分支执行完毕,跳出整个 case 语句。
  • *) : 类似于其他语言中的 default,匹配所有未列出的情况。
执行逻辑
  1. 计算 case 后面的字符串变量的值。
  2. 从上到下依次与各个模式进行匹配。
  3. 一旦匹配成功,则执行对应分支的命令表,直到遇到 ;; 后跳出整个 case 结构。
  4. 如果没有模式匹配,且存在 *) 分支,则执行默认命令表。
示例
bash 复制代码
#!/bin/bash

echo "请选择操作:"
echo "1) 启动服务"
echo "2) 停止服务"
echo "3) 重启服务"
read -p "请输入选项 (1-3): " choice

case $choice in
    1)
        echo "正在启动服务..."
        # systemctl start myservice
        ;;
    2)
        echo "正在停止服务..."
        # systemctl stop myservice
        ;;
    3)
        echo "正在重启服务..."
        # systemctl restart myservice
        ;;
    *)
        echo "输入错误!请输入 1, 2 或 3。"
        ;;
esac

echo "case 语句执行完毕。"

运行结果:

  • 输入 1,输出:正在启动服务...case 语句执行完毕。
  • 输入 4,输出:输入错误!请输入 1, 2 或 3。case 语句执行完毕。

总结与对比

特性 if...then...fi case...esac
用途 基于条件表达式(真/假)进行分支。 基于字符串模式匹配进行多路分支。
结构 if-then-fi,可配合 elifelse case-in-esac,每个分支以 模式) 开始,以 ;; 结束。
可读性 适合复杂的逻辑判断。 适合对单一变量的多个离散值进行判断,代码更简洁。
终止符 无特殊终止符,块由关键字界定。 每个分支必须用 ;; 终止。

掌握这两种条件语句,能够让你编写出逻辑清晰、结构严谨的 Shell 脚本。