Shell脚本-流程控制语句基本语法结构
一、前言
在 Linux 系统管理和自动化运维中,Shell 脚本 是最常用的工具之一。而要编写高效、灵活的 Shell 脚本,掌握 流程控制语句 是必不可少的基础技能。
本文将带你全面学习 Shell 脚本中常用的流程控制语句,包括:
✅ if
条件判断(单分支、双分支、多分支)
✅ case
多分支选择
✅ for
循环(遍历列表、C 风格)
✅ while
与 until
循环
✅ break
和 continue
控制循环
✅ 实际开发中的典型应用案例
所有代码均使用 bash
编写,兼容大多数 Linux/Unix 系统。
二、Shell 脚本基础回顾
在开始之前,确保你的脚本以正确的解释器开头:
#!/bin/bash
保存为 .sh
文件后,赋予执行权限:
chmod +x script.sh
./script.sh
三、if 条件判断语句
if
语句是最基本的条件控制结构,用于根据条件执行不同的代码块。
✅ 1. 单分支 if 语句
if [ 条件 ]; then命令
fi
示例:判断文件是否存在
#!/bin/bash
if [ -f "/etc/passwd" ]; thenecho "文件存在"
fi
✅ 2. 双分支 if-else 语句
if [ 条件 ]; then命令1
else命令2
fi
示例:判断用户输入是否为正数
#!/bin/bash
read -p "请输入一个数字:" numif [ $num -gt 0 ]; thenecho "这是一个正数"
elseecho "这不是一个正数"
fi
✅ 3. 多分支 if-elif-else 语句
if [ 条件1 ]; then命令1
elif [ 条件2 ]; then命令2
else命令3
fi
示例:判断成绩等级
#!/bin/bash
read -p "请输入成绩:" scoreif [ $score -ge 90 ]; thenecho "等级:A"
elif [ $score -ge 80 ]; thenecho "等级:B"
elif [ $score -ge 70 ]; thenecho "等级:C"
elseecho "等级:D"
fi
四、case 多分支选择语句
当条件较多时,case
比 if-elif
更清晰、高效。
✅ 语法结构
case 变量 in模式1)命令1;;模式2)命令2;;*)默认命令;;
esac
⚠️
*
表示默认匹配,;;
表示结束当前分支。
示例:菜单选择
#!/bin/bash
echo "请选择操作:"
echo "1) 查看日期"
echo "2) 查看磁盘使用"
echo "3) 查看内存使用"
read -p "输入选项:" choicecase $choice in1)date;;2)df -h;;3)free -h;;*)echo "无效选项";;
esac
五、for 循环语句
for
循环用于重复执行一组命令。
✅ 1. 遍历列表(字符串或数组)
for 变量 in 列表; do命令
done
示例:遍历文件名
#!/bin/bash
for file in *.txt; doecho "处理文件: $file"
done
示例:遍历数组
names=("Alice" "Bob" "Charlie")
for name in "${names[@]}"; doecho "Hello, $name"
done
✅ 2. C 风格 for 循环
for (( 初始化; 条件; 更新 )); do命令
done
示例:打印 1 到 5
#!/bin/bash
for (( i=1; i<=5; i++ )); doecho "第 $i 次循环"
done
六、while 和 until 循环
✅ 1. while 循环(当条件为真时执行)
while [ 条件 ]; do命令
done
示例:读取文件每行
#!/bin/bash
while read line; doecho "$line"
done < /etc/passwd
示例:计数循环
i=1
while [ $i -le 3 ]; doecho "循环 $i"((i++))
done
✅ 2. until 循环(当条件为假时执行)
until [ 条件 ]; do命令
done
示例:直到用户输入 "quit"
#!/bin/bash
input=""
until [ "$input" = "quit" ]; doread -p "输入命令(quit退出):" inputecho "你输入了:$input"
done
七、break 和 continue 语句
✅ break:跳出当前循环
for i in {1..5}; doif [ $i -eq 3 ]; thenbreakfiecho $i
done
# 输出:1 2
✅ continue:跳过本次循环,进入下一次
for i in {1..5}; doif [ $i -eq 3 ]; thencontinuefiecho $i
done
# 输出:1 2 4 5
八、实际开发中的典型应用场景
✅ 场景1:批量处理日志文件
#!/bin/bash
for log in /var/log/*.log; doif [ -s "$log" ]; thengzip "$log"echo "已压缩:$log"elseecho "空文件跳过:$log"fi
done
✅ 场景2:服务状态监控
#!/bin/bash
while true; doif ! systemctl is-active --quiet nginx; thenecho "$(date): Nginx 服务已停止,正在重启..."systemctl restart nginxfisleep 10
done
九、流程控制语句对比表
语句 | 用途 | 适用场景 |
---|---|---|
if | 条件判断 | 简单或复杂条件分支 |
case | 多分支选择 | 多个固定值判断(如菜单) |
for | 遍历循环 | 已知次数或列表 |
while | 条件循环 | 不确定次数,依赖条件 |
until | 反向条件循环 | 直到条件满足为止 |
break | 跳出循环 | 异常退出或满足条件终止 |
continue | 跳过本次循环 | 过滤某些情况 |
十、结语
感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!