Shell 的控制结构分为条件判断、循环、分支选择、跳转四大类,核心就是 if、for、while、until、case、select,配合 break / continue。
注意:shell 语法坑很多,
[ ]本质是命令,括号两边必须有空格;;用来分隔同一行多条语句。
一、条件判断:if /elif/else
语法:
if 条件; then
命令
elif 条件; then
命令
else
命令
fi
条件写法 3 种
[ 表达式 ]:POSIX 标准,兼容性最好[[ 表达式 ]]:Bash 扩展,支持正则、&&||,推荐(( 算术表达式 )):纯数字运算判断
示例:
a=10
if [[ $a -gt 5 ]]; then
echo "a大于5"
elif [[ $a -eq 5 ]]; then
echo "a等于5"
else
echo "a小于5"
fi
常用测试运算符([[ ]])
文件:
-f文件存在且普通文件;-d目录;-e文件存在字符串:
-z空串;-n非空;==相等;!=不等数字:
-gt大于;-ge大于等于;-lt小于;-le小于等于;-eq等于;-ne不等
二、循环结构
1. for 循环
① 列表 for(最常用)
for var in apple banana orange; do
echo $var
done
遍历文件:for f in *.log; do echo $f; done
② C 风格 for(Bash 独有)
for ((i=0; i<10; i++)); do
echo $i
done
2. while 循环:条件为真就执行
i=0
while [[ $i -lt 5 ]]; do
echo $i
((i++))
done
经典:逐行读取文件
while read line; do
echo "$line"
done < test.txt
3. until 循环:条件为假时执行,直到条件成立(和 while 相反)
i=0
until [[ $i -ge 5 ]]; do
echo $i
((i++))
done
循环控制:break /continue
break:跳出整个循环continue:跳过本次循环剩余代码,直接进入下一轮
for i in {1..10}; do
if [[ $i -eq 5 ]]; then
break
fi
echo $i
done
break n/continue n:跳出 / 跳过 n 层嵌套循环
三、多分支选择:case
匹配字符串模式,适合脚本参数解析,通配符支持 * ? []
read -p "输入一个字符:" key
case $key in
a|A) echo "你输入a" ;;
[0-9]) echo "数字" ;;
*) echo "其他字符" ;;
esac
每个分支末尾必须
;;,最后*)相当于 default
四、select 菜单(Bash 特有,交互式菜单)
自动生成选择菜单,常用于运维脚本:
select opt in 重启 停止 退出; do
case $opt in
重启) echo "执行重启" ;;
停止) echo "执行停止" ;;
退出) break ;;
*) echo "无效选项" ;;
esac
done
五、逻辑短路(隐式控制流)
Shell 命令返回 $?,0 = 成功,非 0 = 失败,可以不用 if 直接写:
# && 前面成功才执行后面
[[ -f file.txt ]] && echo "文件存在"
# || 前面失败才执行后面
[[ -f file.txt ]] || echo "文件不存在"
六、函数(也算流程封装)
func() {
echo "函数参数1: $1"
return 0
}
func hello
快速对比表
补充小知识点
Shell 没有
true/false关键字,依靠命令退出码判断;{}是命令组,()是子 shell(里面变量不影响外部);嵌套:if 里面可以写 for 循环,case 里面可以调用函数。
本文原创作者:易君召,详见:https://www.yijunzhao.cn/authors/yijunzhao,转载请注明出处。
原文链接
欢迎访问 小易撩挨踢