在 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秘籍!