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