前言

Linux中,until循环是一种常见的循环结构,用于重复执行代码块,直到某个条件为真为止。

案例

等待网络服务启动

#!/bin/bash
# 等待 MySQL 服务启动
until mysqladmin ping > /dev/null 2>&1
do
sleep 1
done

echo "MySQL 服务已启动"

这个脚本等待 MySQL 服务启动,每隔 1 秒钟检查一次 MySQL 是否已经启动。当 MySQL 服务已经启动,脚本会输出一条消息。

等待某个命令执行成功

#!/bin/bash
# 等待命令执行成功
until some_command
do
sleep 1
done

echo "命令执行成功"

这个脚本等待 some_command 命令执行成功,每隔 1 秒钟检查一次命令执行状态。当命令执行成功,脚本会输出一条消息。

等待用户输入

#!/bin/bash
# 等待用户输入
until read -p "请输入您的姓名:" name && [ -n "$name" ]
do
echo "姓名不能为空"
done

echo "您的姓名是:$name"

这个脚本等待用户输入姓名,如果输入为空,则提示用户重新输入。当输入不为空时,脚本会输出用户输入的姓名。

等待文件被删除

#!/bin/bash
# 等待文件被删除
until [ ! -f /path/to/file ]
do
sleep 1
done

echo "文件已删除"

这个脚本等待文件 /path/to/file 被删除,每隔 1 秒钟检查一次文件是否存在。当文件不存在时,脚本会输出一条消息。

等待某个目录存在

#!/bin/bash
# 等待目录存在
until [ -d /path/to/dir ]
do
sleep 1
done

echo "目录已存在"

这个脚本等待目录 /path/to/dir 存在,每隔 1 秒钟检查一次目录是否存在。当目录存在时,脚本会输出一条消息。

等待用户按下某个键

#!/bin/bash
# 等待用户按下某个键
until read -n1 -p "按下任意键继续..." key && [ "$key" != "" ]
do
echo "无效的键值:$key"
done

echo "您按下了键:$key"

这个脚本等待用户按下任意键,如果用户按下了无效的键,则提示用户重新输入。当用户按下有效的键时,脚本会输出用户按下的键值。

等待某个文件夹中有文件

#!/bin/bash
# 等待文件夹中有文件
until [ "$(ls -A /path/to/folder)" ]
do
sleep 1
done

echo "文件夹中有文件"

这个脚本等待目录 /path/to/folder 中有文件,每隔 1 秒钟检查一次目录中是否有文件。当目录中有文件时,脚本会输出一条消息。

等待某个进程退出

#!/bin/bash
# 等待进程退出
until ! pgrep -x "some_process" > /dev/null
do
sleep 1
done

echo "进程已退出"

这个脚本等待进程 some_process 退出,每隔 1 秒钟检查一次进程是否存在。当进程退出后,脚本会输出一条消息。

等待某个端口开放

#!/bin/bash
# 等待端口开放
until nc -z localhost 8080
do
sleep 1
done

echo "端口已开放"

这个脚本等待本地的 8080 端口开放,每隔 1 秒钟检查一次端口是否开放。当端口开放后,脚本会输出一条消息。

等待某个服务启动

#!/bin/bash
# 等待服务启动
until systemctl status some_service | grep "Active: active (running)" > /dev/null
do
sleep 1
done

echo "服务已启动"

这个脚本等待服务 some_service 启动,每隔 1 秒钟检查一次服务的状态。当服务启动后,脚本会输出一条消息。

使用事项

  • until 循环与 while 循环类似,不同之处在于 until 循环会一直循环,直到条件为真才会停止,而 while 循环会一直循环,直到条件为假才会停止。
  • until 循环的语法格式为:until condition; do commands; done,其中 condition 表示循环条件,commands 表示需要执行的命令。
  • until 循环中,可以使用 sleep 命令来延迟循环执行的时间,避免过度消耗系统资源。
  • 在循环条件中使用 && 运算符可以将多个条件组合起来,只有当所有条件都满足时,循环才会结束。
  • 在循环条件中使用 || 运算符可以将多个条件组合起来,只有当任意一个条件满足时,循环才会结束。
  • 在循环体中使用 break 命令可以提前结束循环。
  • 在循环体中使用 continue 命令可以跳过当前循环,直接执行下一次循环。
  • 在使用 until 循环时,要确保循环条件最终能够被满足,否则循环会一直执行下去,直到被手动中断。
  • 在循环条件中,要使用测试命令或者其他命令来判断条件是否为真,比如使用 [ 或者 test 命令来进行比较或者测试。
  • 在循环体中,可以使用各种 Shell 命令和语句来执行一系列操作,比如打印输出、文件操作、进程管理、网络通信等等。
  • until 循环可以用于各种场景,比如等待某个操作完成、等待某个资源可用、等待某个服务启动等等,只需要根据具体需求编写相应的脚本即可。