Shell脚本while循环语法详解

2023-10-28

1.概述

本章中,开始介绍循环的概念。循环可用于重复执行程序的某一部分,本文介绍while循环。

2.while

while命令的语法如下:

while commands; do commands; done

示例:

[sysadmin@ansible bin]$ cat while-count
#!/bin/bash

# while-count

count=1

while [[ "$count" -le 5 ]]; do
        echo "$count"
        count=$((count + 1))
done
echo "Finshed."
[sysadmin@ansible bin]$ while-count
1
2
3
4
5
Finshed.

和if一样,while会判断命令列表的退出状态值。只要退出状态值为0,就执行循环内的命令。使用while命令改进read-menu程序。

[sysadmin@ansible bin]$ cat while-menu
#!/bin/bash

#while-menu

DELAY=3 #显示结果的秒数

while [[ "$REPLY" != 0 ]]; do
        clear
        cat <<- _EOF_
        Please Select:

        1.Display System Information
        2.Display Disk Space
        3.Display Home Space Utilization
        0.Quit
        _EOF_
read -p "Enter selection [0-3] > "

if [[ "$REPLY" =~ ^[0-3]$ ]]; then
        if [[ "$REPLY" == 1 ]]; then
                echo "Hostname: $HOSTNAME"
                uptime
                sleep "$DELAY"
        fi

        if [[ "$REPLY" == 2 ]]; then
                df -h
                sleep "$REPLY"
        fi

        if [[ "$REPLY" == 3 ]]; then
                if [[ "$(id -u)" -eq 0 ]]; then
                        echo "Home Space Utilization (ALL Users)"
                        du -sh /home/*
                else
                        echo "Home Space Utilizaion ($USER)"
                        du -sh "$HOME"
                fi
                sleep "$DELAY"
        fi
else
        echo "Invalid entry." >&2
        sleep "$DELAY"
fi
done
echo "Program terminated."

3. 跳出循环

Bash提供了两个内建命令,可用户控制循环内部的程序流程。break命令会立即终止循环,程序从循环之后的语句开始继续执行。continue命令则跳过本次循环中剩余的部分,直接开始下一次循环。下面这个版本的while-menu程序引入了break和continue:

#!/bin/bash

#while-menu

DELAY=3 #显示结果的秒数

while true; do
        clear
        cat <<- _EOF_
        Please Select:

        1.Display System Information
        2.Display Disk Space
        3.Display Home Space Utilization
        0.Quit
        _EOF_
read -p "Enter selection [0-3] > "

if [[ "$REPLY" =~ ^[0-3]$ ]]; then
        if [[ "$REPLY" == 1 ]]; then
                echo "Hostname: $HOSTNAME"
                uptime
                sleep "$DELAY"
                continue
        fi

        if [[ "$REPLY" == 2 ]]; then
                df -h
                sleep "$REPLY"
                continue
        fi

        if [[ "$REPLY" == 3 ]]; then
                if [[ "$(id -u)" -eq 0 ]]; then
                        echo "Home Space Utilization (ALL Users)"
                        du -sh /home/*
                else
                        echo "Home Space Utilizaion ($USER)"
                        du -sh "$HOME"
                fi
                sleep "$DELAY"
                continue
        fi

        if [[ "$REPLY" == 0 ]]; then
                break
        fi
else
        echo "Invalid entry." >&2
        sleep "$DELAY"
fi
done
echo "Program terminated."

true命令向while提供退出状态值,从而形成一个无限循环。true的退出状态值始终为0,所以循环永不会停止。因为循环不会自己结束,所以需要程序员提供某种方式,使其在恰当的时刻跳出循环。在上述脚本中,如果用户选择了0,break命令用于退出循环。为使脚本执行更加高效,在其他处理菜单选项的脚本部分的结尾使用了continue。在确认用户选择之后,continue使脚本可以跳过不必要的代码。

4. until

until与while大同小异,只不过while在退出状态值不为0时结束循环,而until则与之相反。until循环会在接收到为0的退出状态时终止。使用until改写while-count脚本。

[sysadmin@ansible bin]$ cat until-count
#!/bin/bash

# unitil-count

count=1

until [[ "$count" -gt 5 ]]; do
        echo "$count"
        count=$((count + 1))
done
echo "Finshed."
[sysadmin@ansible bin]$ until-count
1
2
3
4
5
Finshed.
[sysadmin@ansible bin]$

5. 使用循环读取文件

while和until都能处理标准输入,这使使用while和until循环处理文件成为可能。

[sysadmin@ansible bin]$ cat distros.txt
aa  bb  cc
[sysadmin@ansible bin]$ cat while-read
#!/bin/bash

# while-read

while read distro version release; do
        printf "Distro: %s\tVersion: %s\tReleased: %s\n" \
                "$distro" \
                "$version" \
                "$release"
done < distros.txt

[sysadmin@ansible bin]$ while-read
Distro: aa      Version: bb     Released: cc

为了将文件重定向到循环,在done语句之后加上了重定向操作符。循环会使用read读入被重定向文件的各个字段。每读入一行,read将返回退出状态值0并退出,直至读完整个文件。这时,它返回的是非0退出状态,因此结束了循环。
也可以通过管道将标准输入传入循环

#!/bin/bash

# while-read

sort -k 1,1 -k 2n distros.txt | while read distro version release; do
        printf "Distro: %s\tVersion: %s\tReleased: %s\n" \
                "$distro" \
                "$version" \
                "$release"
done

这里,我们获取sort命令的输出结果并显示文本流。但由于管道使循环在子Shell中执行,任何在循环内创建或复制的变量在循环结束后都荡然无存,这点很重要,一定要记住。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Shell脚本while循环语法详解 的相关文章

  • C++ 退出双层for循环,解决 break、return、continue无法实现问题

    遇到一个情景 xff0c 采用双层for循环 遍历图像的像素 xff0c 当找到某一个像素点满足条件时 xff0c 退出双层for 循环 首先了解一下 continue break return 各自功能用法 xff1a 1 continu
  • 买房子问题(break,continue,return的区别)

    问题描述 xff1a 蒜头君从现在开始工作 xff0c 年薪 NN 万 他希望在蒜厂附近买一套 6060 平米的房子 xff0c 现在价格是 200200 万 假设房子价格以每年百分之 KK 增长 xff0c 并且蒜头君未来年薪不变 xff
  • continue和break的区别

    break 语句很重要 xff0c 用得非常多 xff0c 初学者一定要掌握 continue 语句虽然没有 break 语句用得多 xff0c 但也经常用到 xff0c 而且不可或缺 xff0c 需要用到 continue 的时候其他语句
  • PHP 出现 ‘continue’ not in the ‘loop’ or ‘switch’ context错误

    把 continue 删除 改为 return 即可
  • C语言从入门到精通第10天(break和continue的使用)

    break和continue的使用 break语句continue语句 break和continue是两种控制流程的语句 xff0c 他们只能在循环中被使用 xff0c 用于控制循环的执行 如果在非循环中被使用了则会导致语法的错误 brea
  • C 语言中的goto、 break 和 continue 语句使用

    一 goto 语句 goto 语句为无条件跳转 xff0c goto 语句后面带一个标识符 xff0c 该标识符是同一个函数 内某条语句的标号 标号可以出现在任何可执行语句的前面 xff0c 并且以一个冒号 xff1a 作为后缀 gt Fi
  • switch 中 break 和 continue 的区别

    1 break 用来退出 switch xff0c continue 本身是不能用在 switch 里的 xff0c 他必须结合循环来用 xff0c 表示跳过本次循环 2 switch 的 case 语句最后如果没有加 break cont
  • Shell脚本while循环语法详解

    1 概述 本章中 开始介绍循环的概念 循环可用于重复执行程序的某一部分 本文介绍while循环 2 while while命令的语法如下 while commands do commands done 示例 sysadmin ansible
  • Java基础语法结构

    顺序结构 java的基本结构就是顺序结构 除非特别指明 否则就是按从上到下执行 顺序结构是最简单的算法结构 顺序结构的程序语句只能被执行一次 如果您想要同样的操作执行多次 就需要使用循环结构 顺序结构是任何一个算法都离不开的一种基本算法结构
  • for循环三种跳出循环的方法(retrun、continue、break)Mark

    1 continue 指的是跳出当前循环 即不执行continue后的语句 直接进入下次循环 continue语句和break语句差不多 不同的是 它不是退出一个循环 而是跳出当前循环 进行下一轮循环 public static void
  • 通过 Break 和 continue 掌握 Bash 控制流程

    Bash 是一种功能强大的脚本语言 通常用于自动化和系统管理任务 Bash 脚本中最重要的概念之一是控制流 它是指脚本根据各种条件执行不同命令的方式 Bash 中两个关键的控制流语句是 break 和 continue 它们可以帮助您控制代
  • C++中break与continue的用法

    根据break的用法 是在循环体内 强行结束循环的执行 也就是结束整个循环的过程 不再执行循环的条件是否成立 直接转向循环语句下面的语句 continue的作用 在循环语句中 跳出本次循环中余下尚未执行的语句 继续执行下一次循环 其包括两点
  • Python入门_使用while循环计算1-100之间偶数和

    案例 计算1 100之间所有偶数的和 i 1 定义一个变量sum为0 用来存放和 sum 0 while i lt 100 每次sum和i相加 if i 2 0 sum i i 1 执行完之后 打印sum的值 print 1 100之间偶数
  • C++编写优先队列打印任务

    打印机的打印队列中 每一个打印任务都有一个优先级 为1 9的一个整数 9的优先级最高 1的优先级最低 打印按如下方法进行 1 取出打印队列中队首的打印任务J 2 如果打印队列中存在优先级高于J的打印任务 则将J移动到打印队列的队尾 否则 打
  • 为什么是这样:需要通过才能继续处理? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 有人可以解释为什么else pass为了完成其余代码
  • 继续认为有害? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 出现异常时继续执行

    下面是我要执行的脚本 这里的问题是一旦发生异常它就会停止执行 我用过continue在 catch 块中 但这不起作用 即使发生异常后 我如何让它工作 它应该循环foreach 我也用过一个while true 循环 但进入了无限循环 该怎
  • 有没有办法在 C# 中继续异常?

    当您的程序 在调试器中 发生意外异常时 有时您只想跳过它 因为此时终止程序比继续运行更有害 或者您只是想继续 因为您对另一个错误 错误更感兴趣 是否有选项 编译器标志 秘密开关来启用此功能 我知道应该立即解决异常 但在某些情况下 就像我所描
  • PHP continue 函数内

    这可能非常微不足道 但我一直无法弄清楚 这有效 function MyFunction Do stuff foreach x as y MyFunction if foo bar continue Do stuff echo output
  • PHP 有没有办法在 foreach 中重新启动循环,或更改 switch 中的测试值?

    如果我正在循环一个数组 并且在其中一个循环的中间我发现一些小问题 改变 一些东西 并且需要重试 有没有办法跳回到循环顶部而不从数组中获取下一个值 我怀疑这是否存在 但它会是一些关键字 例如continue or break 事实上 它很像c

随机推荐

  • 线程池的核心线程数 设置大小与cpu 的关系

    1 CPU密集型 CPU bound CPU密集型也叫计算密集型 指的是系统的硬盘 内存性能相对CPU要好很多 此时 系统运作大部分的状况是CPU Loading 100 CPU要读 写I O 硬盘 内存 I O在很短的时间就可以完成 而C
  • 智能语音导航与呼叫中心对接图解

    智能语音导航与呼叫中心对接图解 采用国际标准语音mrcpv2协议进行对接 对接排查可通过 tcpdump X s0 i 网卡名 w 抓包名 pcap 然后可通过WiresharkPortable工具去分析 通过mrcp中的三种工作协议排查问
  • 数据库原理:关系运算(选择、投影、连接、除),例题加深理解

    一 关系运算 首先定义符号 R和S分别表示为一个关系 选择 定义 式中 F表示选择条件 是一个逻辑表达式 简单来说 就是只留下我想要的 满足我给出的条件F就留下 选择是对行做操作 删掉的是不满足条件规定的属性值的那一行或者几行 元组 投影
  • 史上最全的整数分解方法(包含经典的分苹果问题)

    华为OD机试真题 2022 2023 真题目录 点这里 华为OD机试真题 信号发射和接收 试读 点这里 华为OD机试真题 租车骑绿道 试读 点这里 整数分解方法总结 一 加法分解 题目描述 给定一个正整数 我们可以定义出下面的公式 N a
  • 一维卷积(计算过程)

    现在大部分的深度学习教程中都把卷积定义为图像矩阵和卷积核的按位点乘 实际上 这种操作应该是互相关 cross correlation 而卷积需要把卷积核顺时针旋转180度然后再做点乘 一维卷积分为 full卷积 same卷积和valid卷积
  • Elasticsearch启动报错问题汇总

    参考链接elasticsearch启动报错解决 问题集分析 程序白阿渣的博客 CSDN博客 es启动报错
  • 872. 叶子相似的树-遍历树存储数据对比

    872 叶子相似的树 请考虑一棵二叉树上所有的叶子 这些叶子的值按从左到右的顺序排列形成一个 叶值序列 举个例子 如上图所示 给定一棵叶值序列为 6 7 4 9 8 的树 如果有两棵二叉树的叶值序列是相同 那么我们就认为它们是 叶相似 的
  • LeetCode 59. Spiral Matrix II 解题报告

    LeetCode 59 Spiral Matrix II 解题报告 题目描述 Given an integer n generate a square matrix filled with elements from 1 to n2 in
  • [JAVA]javase简单总结

  • 获取某接口的所有实现类并初始化

    日前项目中遇到一个问题 有一个接口 这个接口定义了一种规范和标志 接口中只有一个初始化方法 接口的实现类可能会有非常多 所以现在容器启动过程中我们去手动初始化这个接口的所有实现类 虽然在spring中我们可以直接配置 但是维护与使用时却不够
  • ios中safari无痕浏览模式下,localStorage的支持情况

    前言 前阶段 测试提了个bug 在苹果手机中无痕模式下 搜索按钮不好使 无法跳页 同时搜索历史也没有展示 用户搜索历史时使用localStorage存储 正文 iOS上Sarfari在无痕模式下 浏览器假装支持localStorage 并在
  • python 基础综合应用——小开发

    综合复习 变量 循环 函数 模块 开发 名片管理系统 名片管理系统介绍 名片管理系统可以理解成花名册软件 通过个人新建人的信息后可以进行查询等简单操作的程序 名片管理系统有三个作用 1 新建名片 2 显示全部名片 3 查询名片 欢迎使用 名
  • 我的第一个Mybatis程序

    一开始可能会遇到的问题 一共七步 第一步 配置maven pom xml文件 1 父工程
  • java中将list集合对象转换成JSONArray数组

    import com alibaba fastjson JSONArray JSONArray array JSONArray parseArray JSON toJSONString list
  • php mysql索引值_PHP面试必备

    MySQL 的优化主要分为结构优化 Scheme optimization 和查询优化 Query optimization 本文讨论的高性能索引策略主要属于结构优化范畴 本文的内容完全基于上文的理论基础 实际上一旦理解了索引背后的机制 那
  • python练习题(二十一):利用递归方法求n!

    题目 利用递归方法求n def factorial x if x 0 return 1 else return x factorial x 1 n int input 请输入n print n d factorial n 运行结果
  • 计算机网络第二章后部分

    IGMP IGMP 互联网组管理协议 M在主机与其直接连接的路由器之间进行操作 M 也称为组成员协议 M为主机提供通知其连接的路由器他的应用程序的手段 加入或离开多播组 m注意 IGMP不在组中的所有主机之间运行 而是受限于主机和路由器之间
  • 数学建模——产生随机数的Matlab命令

    在MATLAB软件中 可以直接产生满足各种分布的随机数 命令如下 文章目录 r a n d
  • 查看jvm内存使用情况方法

    1 jinfo flags pid 查询虚拟机运行参数信息 2 jinfo flag name pid 查询具体参数信息 3 jmap heap pid 输出堆内存设置和使用情况 JDK11使用jhsdb jmap heap pid pid
  • Shell脚本while循环语法详解

    1 概述 本章中 开始介绍循环的概念 循环可用于重复执行程序的某一部分 本文介绍while循环 2 while while命令的语法如下 while commands do commands done 示例 sysadmin ansible