四时宝库

程序员的知识宝库

Linux Shell 编程通关:4 大流程控制语句手把手封神

在 Linux 世界里,Shell 脚本是自动化运维、系统管理的 “瑞士军刀”。无论是批量处理文件、定时任务调度,还是服务启停控制,掌握 Shell 编程都能让你效率翻倍。而流程控制语句,正是 Shell 脚本的 “灵魂”—— 它们像交通信号灯一样,指挥代码按逻辑有序执行。今天,我们就手把手拆解 Shell 中最核心的 4 大流程控制语句,让你从 “脚本小白” 直接进阶 “自动化高手”。

一、if 语句:条件判断的 “万能钥匙”

if 语句是 Shell 中最基础的条件控制工具,能根据不同条件执行不同操作,堪称 “脚本中的决策脑”。它有三种经典结构,覆盖从简单到复杂的判断场景。

1. 单分支 if:“满足条件就做事”

当你只需要判断 “一件事是否成立” 时,单分支 if 足够简洁。语法结构如下:

bash

if [ 条件测试 ]; then
  # 条件为真时执行的命令
fi

比如检查/etc/passwd文件是否存在(系统用户配置文件,缺失会导致登录故障):

bash

if [ -e "/etc/passwd" ]; then
  echo "系统用户配置文件正常"
fi

这里的-e是文件测试运算符,判断文件是否存在。记住:[ ]前后必须有空格,否则会报错!

2. if-else:“二选一” 的经典逻辑

遇到 “非此即彼” 的场景,比如判断一个路径是目录还是文件,if-else 能完美应对。语法结构:

bash

if [ 条件测试 ]; then
  # 条件为真时执行的命令
else
  # 条件为假时执行的命令
fi

示例:判断/tmp是否为目录(/tmp是系统临时目录,必须为目录才能正常工作):

bash

if [ -d "/tmp" ]; then
  echo "/tmp是正常的临时目录"
else
  echo "/tmp异常,可能影响程序运行!"
fi

-d是目录测试运算符,专门判断路径是否为目录。这种 “非 A 即 B” 的逻辑,在故障排查脚本中高频使用。

3. if-elif-else:多场景的 “分支导航”

当需要判断 “多个层级条件” 时,比如根据分数评级、根据服务状态执行不同操作,就轮到 if-elif-else 登场了。语法结构:

bash

if [ 条件1 ]; then
  # 条件1为真时执行
elif [ 条件2 ]; then
  # 条件2为真时执行
else
  # 所有条件都为假时执行
fi

经典案例:根据输入分数判断等级(学生成绩统计、绩效评级都能用):

bash

read -p "请输入分数: " score
if [ $score -ge 90 ]; then
  echo "优秀"
elif [ $score -ge 80 ]; then
  echo "良好"
elif [ $score -ge 60 ]; then
  echo "及格"
else
  echo "不及格"
fi

这里的-ge是比较运算符,代表 “大于等于”。注意:变量$score必须是数字,否则会触发语法错误。

二、for 循环:批量处理的 “流水线”

如果说 if 是 “决策脑”,那 for 循环就是 “流水线工人”—— 它能批量处理一组数据,从数字、文件列表到数组元素,逐一 “过筛子”。

1. 遍历有范围的数据:“从 1 到 N 的重复劳动”

当处理的数据有明确范围(比如 1 到 100 的数字、指定目录下的文件),for 循环堪称 “神器”。基础语法:

bash

for 变量名 in 取值列表; do
  # 执行的操作
done

比如打印 1 到 5 的数字,两种写法任你选:

bash

# 方法1:用{起始..结束}表示范围
for i in {1..5}; do
  echo $i
done

# 方法2:用(( ))条件表达式
for ((i=1; i<=5; i++)); do
  echo $i
done

2. 遍历数组:“一个都不能少”

处理一组关联数据(比如服务器列表、软件包名称)时,数组 + for 循环是黄金组合。关键是记住"${数组名[@]}"能保留元素独立性:

bash

# 定义水果数组
fruits=("apple" "banana" "orange")
# 遍历数组并打印每个元素
for fruit in "${fruits[@]}"; do
  echo "当前水果:$fruit"
done

如果用"${fruits[*]}",数组会被合并成一个字符串,适合整体输出场景。

3. 无限循环:“直到指令才停下”

for (( ; ; ))能创建无限循环,配合break(退出循环)和continue(跳过当前迭代),能实现 “持续等待指令” 的效果。比如一个简易交互终端:

bash

for (( ; ; )); do
  read -p "输入命令(exit退出): " cmd
  if [ "$cmd" = "exit" ]; then
    echo "退出程序"
    break  # 输入exit则退出循环
  else
    echo "执行命令:$cmd"
  fi
done

三、while 循环:“条件为真就不停”

和 for 循环的 “固定范围” 不同,while 循环更适合 “条件持续成立” 的场景 —— 只要条件为真,就反复执行命令,直到条件不满足为止。

1. 条件循环:“达到目标就收手”

比如从 1 数到 100,用 while 循环判断 “是否小于等于 100”:

bash

count=1
while [ $count -le 100 ]; do
  echo $count
  count=$((count + 1))  # 变量自增
done

也可以用(( ))简化条件判断,代码更简洁:

bash

count=1
while ((count <= 100)); do
  echo $count
  ((count++))  # 简化自增写法
done

2. 无限循环:“除非外力干预”

while true是创建无限循环的经典写法,适合需要持续运行的脚本(比如监控程序)。配合sleep还能实现 “定时执行”:

bash

# 每1秒打印一次提示,按Ctrl+C停止
while true; do
  echo "运行中...按Ctrl+C停止"
  sleep 1  # 暂停1秒
done

这种结构在日志监控、服务保活脚本中高频使用。

四、case 语句:“多分支判断的精简版”

当需要判断 “变量是否匹配多个固定模式” 时,用 case 语句比一堆if-elif更简洁。比如判断字符类型、处理命令行参数,case 能让代码可读性飙升。

语法与核心规则

case 语句的结构像 “填空题”,找到匹配的模式就执行对应命令:

bash

case 变量 in
  模式1)
    命令1
    ;;  # 结束当前分支
  模式2)
    命令2
    ;;
  *)  # 默认模式,所有不匹配时执行
    默认命令
    ;;
esac  # case的反写,代表结束

模式支持通配符(比如[a-z]匹配小写字母,*.txt匹配所有 txt 文件)。

实例:判断字符类型

输入一个字符,瞬间判断是小写字母、大写字母、数字还是特殊字符:

bash

echo "请输入一个字符:"
read char
case $char in
  [a-z])  # 匹配小写字母
    echo "是小写字母"
    ;;
  [A-Z])  # 匹配大写字母
    echo "是大写字母"
    ;;
  [0-9])  # 匹配数字
    echo "是数字"
    ;;
  *)  # 其他情况
    echo "是特殊字符"
    ;;
esac

相比用if-elif写一堆判断,case 的代码更短、逻辑更清晰。

总结:选对语句,效率翻倍

掌握这 4 大流程控制语句,Shell 编程就掌握了 80% 的核心逻辑:

  • 单条件判断用if,双分支用if-else,多分支用if-elif-else;
  • 固定范围数据用for,持续条件判断用while;
  • 多模式匹配用case,比嵌套if更优雅。

练习时可以从简单场景入手:比如用for批量创建用户,用while监控服务状态,用case处理脚本参数。多写多练,你会发现 —— 原来 Linux 自动化可以这么简单!


感谢关注【AI码力】,获取更多Linux秘籍!

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接