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

 更新时间:2025年08月25日 08:31:08   作者:咖啡の猫  
本文主要介绍了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语法结构内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Linux环境下tcpdump网络协议抓包与解析

    Linux环境下tcpdump网络协议抓包与解析

    这篇文章主要为大家介绍了Linux环境下tcpdump网络协议抓包与解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • Shell脚本之Expect免交互的实现

    Shell脚本之Expect免交互的实现

    这篇文章主要介绍了Shell脚本之Expect免交互的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • Linux 中ls命令的使用详细介绍

    Linux 中ls命令的使用详细介绍

    本文是小编整理的ls命令的基本使用方式,文中示例中的命令选项都可以进行任意组合来使用,比如倒序排序使用"ls -rs"命令等,对Linux 中ls命令用法感兴趣的朋友一起看看吧
    2022-06-06
  • 一个简单的linux命令 mkdir

    一个简单的linux命令 mkdir

    这篇文章主要介绍了一个简单的linux命令mkdir,mkdir 命令用于创建指定名称的目录,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • Linux Shell循环中实现展示进度百分比的实现方法

    Linux Shell循环中实现展示进度百分比的实现方法

    这篇文章主要介绍了Linux Shell循环中实现展示进度百分比的实现方法的相关资料,这里提供实现方法及实例,需要的朋友可以参考下
    2017-08-08
  • linux命令详解之useradd命令使用方法

    linux命令详解之useradd命令使用方法

    这篇文章主要介绍了useradd命令使用方法,还包括用户账号的添加、删除与修改、用户口令的管理、用户组的管理方法,大家参考使用吧
    2014-01-01
  • Shell脚本自动备份MySQL到FTP并定期清理过期备份

    Shell脚本自动备份MySQL到FTP并定期清理过期备份

    这篇文章主要介绍了Shell脚本自动备份MySQL到FTP并定期清理过期备份,本文中的脚本同时实现了定期清理旧备份数据的功能,这是一大特色,需要的朋友可以参考下
    2014-12-12
  • shell脚本declare命令的用法详解(声明变量的属性和类型)

    shell脚本declare命令的用法详解(声明变量的属性和类型)

    这篇文章主要介绍了shell脚本declare命令用法(声明变量的属性和类型,declare 命令在一般的脚本编写中并不常用,大多数情况下直接使用简单的变量赋值语句即可满足需求,需要的朋友可以参考下
    2023-06-06
  • 更改linux用户登录shell的操作方法

    更改linux用户登录shell的操作方法

    这篇文章主要为大家分享了更改linux用户登录shell的方法,感兴趣的朋友可以参考下
    2013-11-11
  • 开发必备Linux常用的几个命令分享

    开发必备Linux常用的几个命令分享

    Linux作为一个高度成熟和强大的操作系统,拥有非常丰富的命令行工具,对于Java开发者来说,掌握一些常用的Linux命令可以大大提高工作效率,尤其是在服务器端开发时,本文小编给大家分享了一些常用命令,需要的朋友可以参考下
    2023-10-10

最新评论