linux shell

关注公众号 jb51net

关闭
首页 > 脚本专栏 > linux shell > Shell until语法结构

Shell脚本until语法结构的具体使用

作者:咖啡の猫

本文主要介绍了Shell脚本-until语法结构的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、前言

在 Shell 脚本编程中,循环结构是实现自动化任务的核心工具之一。除了常见的 forwhile 循环外,until 循环提供了一种“直到条件为真才停止”的逻辑控制方式,特别适用于某些特定场景。

本文将带你全面掌握 until 循环的语法结构、执行流程、使用场景以及最佳实践,并通过多个实用代码示例帮助你快速上手。

二、until循环的基本语法

until 循环的执行逻辑是:

先判断条件是否为假,如果为假,则执行循环体;直到条件变为真,循环结束。

✅ 语法结构:

until [ 条件判断 ]
do
    # 循环体
    命令1
    命令2
    ...
done

⚠️ 注意:条件判断使用的是 [ ] 或 test 命令,也可以使用 (( )) 进行数值比较。

三、执行流程图解

      +------------------+
      |   执行 until     |
      +------------------+
               |
               v
      +------------------+
      | 条件是否为真?    |<---+
      +------------------+   |
            /     \         |
         是/       \否       |
          v         v       |
    +---------+  +-----------+
    | 退出循环 |  | 执行循环体 |
    +---------+  +-----------+
                     |
                     +------->(回到条件判断)

💡 也就是说,until 循环至少会执行一次循环体(除非条件一开始就为真)。

四、简单示例:打印数字 1 到 5

#!/bin/bash

i=1

until [ $i -gt 5 ]
do
    echo "当前数字: $i"
    i=$((i + 1))
done

输出结果:

当前数字: 1
当前数字: 2
当前数字: 3
当前数字: 4
当前数字: 5

✅ 解析:当 i <= 5 时,条件 [ $i -gt 5 ] 为假,循环继续;当 i=6 时,条件为真,循环结束。

五、untilvswhile:关键区别

特性untilwhile
条件判断条件为假时执行条件为真时执行
逻辑直到条件为真才退出当条件为真时继续
使用场景等待某个事件发生持续执行某个任务

✅ 对比示例:实现相同功能

使用until:

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

使用while:

i=1
while [ $i -le 5 ]; do
    echo $i
    i=$((i+1))
done

💡 两者功能相同,但逻辑表达方式相反。

六、实际应用场景

✅ 场景1:等待某个服务启动(如 MySQL)

#!/bin/bash

echo "等待 MySQL 服务启动..."

until nc -z localhost 3306
do
    echo "MySQL 未启动,5秒后重试..."
    sleep 5
done

echo "MySQL 已启动,继续后续操作。"

🔍 说明:nc -z host port 用于检测端口是否开放,直到 MySQL 启动成功才退出循环。

✅ 场景2:用户输入验证(必须输入非空值)

#!/bin/bash

input=""

until [ -n "$input" ]
do
    read -p "请输入用户名: " input
    if [ -z "$input" ]; then
        echo "输入不能为空,请重新输入。"
    fi
done

echo "欢迎你,$input!"

✅ 说明:直到用户输入非空字符串才退出循环。

✅ 场景3:带重试机制的命令执行

#!/bin/bash

max_retries=3
attempt=1

until ping -c1 example.com &>/dev/null || [ $attempt -gt $max_retries ]
do
    echo "第 $attempt 次尝试失败,正在重试..."
    attempt=$((attempt + 1))
    sleep 2
done

if [ $attempt -le $max_retries ]; then
    echo "网络连接成功!"
else
    echo "错误:无法连接网络,已重试 $max_retries 次。"
fi

✅ 说明:最多重试 3 次,成功则提前退出。

七、嵌套循环与控制语句

✅ 示例:嵌套 until 循环

i=1
until [ $i -gt 2 ]
do
    j=1
    until [ $j -gt 3 ]
    do
        echo "i=$i, j=$j"
        j=$((j + 1))
    done
    i=$((i + 1))
done

输出:

 i=1, j=1
i=1, j=2
i=1, j=3
i=2, j=1
i=2, j=2
i=2, j=3

✅ 使用break和continue

i=1
until [ $i -gt 5 ]
do
    if [ $i -eq 3 ]; then
        i=$((i + 1))
        continue  # 跳过本次循环
    fi

    if [ $i -eq 5 ]; then
        break  # 提前退出循环
    fi

    echo "当前值: $i"
    i=$((i + 1))
done

✅ 输出:1、2、4

八、常见错误与调试技巧

错误原因解决方案
无限循环条件永远不为真检查变量是否更新
语法错误缺少 do 或 done检查关键字配对
变量未定义使用未初始化变量初始化变量或添加默认值
条件判断错误使用 = 而不是 -eq(数值比较)数值用 -eq,字符串用 =

🔧 调试建议:使用 set -x 开启调试模式,查看执行过程。

九、总结对比表:until循环要点一览

项目说明
关键字until, do, done
执行逻辑条件为假时执行循环体
至少执行次数1 次(除非条件一开始为真)
适用场景等待事件发生、重试机制、输入验证
常见搭配sleep、ping、nc、read 等命令

十、结语

到此这篇关于Shell脚本until语法结构的具体使用的文章就介绍到这了,更多相关Shell until语法结构内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文