linux shell 编程:until循环

介绍

until 和 while 刚好相反:until 条件为假时,执行循环体;条件为真时,退出循环

while:条件成立 → 执行
until:条件不成立 → 执行

语法格式

until [ 条件 ]
do
    循环体命令
done

等价逻辑:

while ! [ 条件 ]
do
    ...
done

注意:[ ] 是 test 命令,条件判断遵循 shell 规则;也可以用 [[ ]]。

规则

  1. 先判断条件
    • 条件返回非0(假):进入 do 执行循环代码,然后回到条件继续判断
    • 条件返回0(真):直接退出 until 循环
  2. 循环体内部可以用:
    • 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 "循环结束"

常见坑点

  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适合等待某个条件达成就停止的场景(等待服务、等待文件生成),语义更直观。

简写一行写法

i=1; until [ $i -gt 3 ]; do echo $i; i=$((i+1)); done