介绍
until 和 while 刚好相反:until 条件为假时,执行循环体;条件为真时,退出循环
while:条件成立 → 执行
until:条件不成立 → 执行
语法格式
until [ 条件 ]
do
循环体命令
done
等价逻辑:
while ! [ 条件 ]
do
...
done
注意:
[ ]是 test 命令,条件判断遵循 shell 规则;也可以用[[ ]]。
规则
- 先判断条件
- 条件返回非0(假):进入
do执行循环代码,然后回到条件继续判断 - 条件返回0(真):直接退出 until 循环
- 条件返回非0(假):进入
- 循环体内部可以用:
break:立刻跳出循环continue:跳过本次剩余代码,直接回到条件判断
示例1:基础计数器(最常用)
打印 1~5,直到变量大于5退出
#!/bin/bash
i=1
until [ $i -gt 5 ]
do
echo "i = $i"
i=$((i+1))
done
执行输出:
i = 1
i = 2
i = 3
i = 4
i = 5
逻辑解读:until [ $i -gt 5 ]
- i=1:
1>5不成立(返回非0)→ 执行循环 - i=6:
6>5成立(返回0)→ 退出循环
示例2:等待某个服务启动(until经典场景)
等待80端口监听,直到端口存在就退出循环
#!/bin/bash
until ss -tln | grep -q :80
do
echo "等待80端口服务启动..."
sleep 2
done
echo "80端口已就绪!"
业务场景:等待数据库、web服务启动后,再执行后续脚本。
示例3:结合break跳出循环
#!/bin/bash
i=1
until [ $i -gt 10 ]
do
if [ $i -eq 6 ];then
break
fi
echo "i=$i"
i=$((i+1))
done
输出 1~5,i等于6直接break终止循环。
示例4:continue 跳过本次循环
#!/bin/bash
i=0
until [ $i -ge 5 ]
do
i=$((i+1))
if [ $i -eq 3 ];then
continue
fi
echo "i=$i"
done
输出:
i=1
i=2
i=4
i=5
i=3 触发continue,后面echo不执行,回到until条件。
示例5:读取用户输入,直到输入yes退出
#!/bin/bash
read -p "请输入yes结束循环: " input
until [ "$input" = "yes" ]
do
echo "输入不是yes,请重试"
read -p "请输入yes结束循环: " input
done
echo "循环结束"
常见坑点
- 变量自增别忘记:如果不写
i=$((i+1)),条件永远不变 → 死循环 - 空格问题:
[ $i -gt5 ]报错,[ ]里面前后必须留空格,正确:[ $i -gt 5 ] - 字符串比较一定要加双引号:
[ "$var" = "abc" ],防止变量为空报错 - 条件里命令返回码:
until command不需要[ ]例:
until ping -c1 127.0.0.1; do sleep 1; done
ping成功返回0,until检测到返回0,退出循环。
until vs while 对比
| 循环 | 执行时机 |
|---|---|
| while | 条件为真(返回0),执行循环 |
| until | 条件为假(返回非0),执行循环 |
大部分场景while更常用;until适合等待某个条件达成就停止的场景(等待服务、等待文件生成),语义更直观。
简写一行写法
i=1; until [ $i -gt 3 ]; do echo $i; i=$((i+1)); done