易君召
发布于 2026-09-18 / 作者:易君召 / 1 阅读
0

Shell 常见控制结构详解(Bash)

Shell 的控制结构分为条件判断、循环、分支选择、跳转四大类,核心就是 ifforwhileuntilcaseselect,配合 break / continue

注意:shell 语法坑很多,[ ] 本质是命令,括号两边必须有空格; 用来分隔同一行多条语句。

一、条件判断:if /elif/else

语法:

if 条件; then
  命令
elif 条件; then
  命令
else
  命令
fi

条件写法 3 种

  1. [ 表达式 ]:POSIX 标准,兼容性最好

  2. [[ 表达式 ]]:Bash 扩展,支持正则、&& ||推荐

  3. (( 算术表达式 )):纯数字运算判断

示例:

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

快速对比表

结构

作用

适用场景

if/elif/else

分支判断

简单条件、文件判断、参数校验

for

遍历集合 / 计数

遍历文件列表、固定次数循环

while

条件为真循环

读文件、持续等待

until

条件为假循环

等待某个事件就绪

case

模式匹配多分支

命令行参数、菜单匹配

select

交互式菜单

运维脚本交互选择

补充小知识点

  1. Shell 没有 true/false 关键字,依靠命令退出码判断;

  2. {} 是命令组,() 是子 shell(里面变量不影响外部);

  3. 嵌套:if 里面可以写 for 循环,case 里面可以调用函数。


本文原创作者:易君召,详见:https://www.yijunzhao.cn/authors/yijunzhao,转载请注明出处。

原文链接 https://www.yijunzhao.cn/archives/bash-shell-common-control-structures-guide

欢迎访问 小易撩挨踢

https://www.yijunzhao.cn/