until循环在条件为假时执行、为真时退出,适用于等待服务启动等场景;语法为until条件;do命令;done;常见用法包括等待端口、pid文件、http响应及用户输入;需注意返回值、sleep和引号使用。

Linux 中 until 循环用于“条件不成立时反复执行,一旦成立就退出”,语义清晰,特别适合等待类任务——比如等服务启动、等文件生成、等网络就绪。
until 的基本语法和逻辑
until 和 while 正好相反:
-
while:条件为真(返回 0)才执行循环体 -
until:条件为假(返回非 0)才执行循环体;条件为真(返回 0)就立即退出
标准写法是:
until <strong>条件表达式</strong>; do # 循环体(条件不满足时要做的事) done
注意:条件表达式放在 do 前面,每次执行完 done 后都会重新判断一次。
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
常见实用场景与写法
以下例子都经过验证,适用于 bash/zsh(部分需注意 shell 差异):
-
等待某个端口监听成功(如 8080):
until nc -z localhost 8080; do echo "waiting for port 8080..."; sleep 2; done -
等待 PID 文件出现(服务启动完成):
until [ -f /var/run/myapp.pid ]; do sleep 1; done; echo "Service ready" -
重试 HTTP 请求直到返回 200:
until curl -s -o /dev/null -w "%{http_code}" http://api.test | grep -q "^200$"; do sleep 3; done -
让用户输入合法值才继续(如 y/n):
until [[ "$ans" =~ ^[yn]$ ]]; do read -p "Continue? (y/n): " ans; done
容易出错的细节提醒
几个关键点常被忽略,但直接影响脚本是否可靠:
- 条件表达式必须返回退出状态(0 或非 0),不能只靠输出判断。推荐用
[ ]、[[ ]]、test或命令本身(如nc、curl)作为条件 - 避免在条件中直接用
echo或无返回值命令,它们默认返回 0,会导致循环永不退出 - 循环体内记得加
sleep,否则可能疯狂轮询,消耗 CPU - 含空格或特殊字符的变量要用双引号包裹,比如
"$file",防止 word splitting
对比 while 实现同一目标
比如“等文件存在”:
-
until [ -f myfile ]; do sleep 1; done(更自然:直到它存在) -
while ! [ -f myfile ]; do sleep 1; done(逻辑绕一层:当它不存在时循环)
两者功能等价,但 until 写法更贴近人类语言,不易把逻辑写反。










