0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

bash脚本中的循环功能

CHANBAEK 来源:TIAP 作者:TIAP 2022-12-14 17:30 次阅读

循环是 bash 脚本中一个很重要的功能,用途广泛。本篇文章我们介绍三种不同的循环,然后利用循环遍历数组。

for 循环

for 循环有两种不同的写法:

  • c 语言样式的 for 循环;
  • 列表中使用的 for 循环。

c 语言样式的 for 循环

如果你熟悉 c 或者 c++编程语言,那么对于如下循环应该不会陌生:

for ((initialize ; condition ; increment)); do
    [COMMANDS]
done

根据上述语法,我们写一个例子,打印 Hello Friend 十次:

for ((i = 0 ; i < 10 ; i++)); do
    echo "Hello Friend"
done

上述代码中,首先将整型变量 i 初始化为 0,然后设置循环条件(i<10),如果条件为真,则执行循环,打印 Hello Friend,并将变量 i 递增 1,然后进行下一次循环,知道 i<10不再满足。

$ bash hello.sh 
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend

列表中使用的 for 循环

列表循环是 for 循环的一种变体,这在处理列表或者数组的时候特别方便,其语法如下:

for item in [LIST]; do
    [COMMANDS]
done

比如,我们重写一下上面的那个例子:

for i in {1..10}; do
    echo "Hello Friend"
done

另一个例子,下面脚本 var.sh 将打印在 /var 目录下的所有文件和目录:

#!/bin/bash


for i in /var/*; do
    echo $i 
done

执行一下,其输出如下:

$ ./var.sh
/var/backups
/var/cache
/var/crash
/var/lib
/var/local
/var/lock
/var/log
/var/mail
/var/metrics
/var/opt
/var/run
/var/snap
/var/spool
/var/tmp

while 循环

while 循环是 bash 中另一个应用很广泛的循环,其语法如下:

while [ condition ]; do
    [COMMANDS]
done

作为演示,我创建一个名为 3x10.sh 的脚本,用于打印前10个3的倍数:

#!/bin/bash


num=1
while [ $num -le 10 ]; do
echo $(($num * 3))
num=$(($num+1))
done

其执行结果如下:

$ ./3x10.sh
3
6
9
12
15
18
21
24
27
30

上述脚本中,首先将变量 num 初始化为 1,然后设定循环条件为 num 小于或等于 10。在循环体中,打印 num 乘以 3,然后将 num 递增 1。

until 循环

如果你有 c/c++ 编程背景,那你可能会不自觉的找 do-while 循环。但是,在 bash 中并不存在 do-while 循环。

bush 中存在另一种循环,即 until 循环,其与 while 循环具有相同的语法:

until [ condition ]; do
    [COMMANDS]
Done

until 循环与 while 循环之间的主要区别在于循环条件。当循环条件为真时,while 循环会继续,但是,当循环条件为假时,until 循环才会继续。

比如上面我们写的 3x10.sh 脚本,我们使用 until 循环来实现,如下:

#!/bin/bash


num=1
until [ $num -gt 10 ]; do
echo $(($num * 3))
num=$(($num+1))
done

大家应该可以注意到,上面的循环条件为 $num -gt 10,为前一个例子中 -le 的否定。

循环的具体应用

上面我们介绍了 bash 中循环的用法,下面在实际例子中介绍一下循环的使用。

打印数组的内容

在此之前,我们假定大家了解 bash 中的数组

遍历数组,for 循环通常是最首要的选择。

如下脚本 prime.sh 中,将会遍历并打印出数组中的所有元素:

#!/bin/bash


prime=(2 3 5 7 11 13 17 19 23 29)
for i in "${prime[@]}"; do
echo $i
done

执行一下,结果如下:

$ ./prime.sh
2
3
5
7
11
13
17
19
23
29

在循环中使用 break 和 continue

有时候我们可能希望提前退出循环,或者跳过本次循环。那么此时需要分别使用 break 和 continue。

break 将会终止循环,并将程序控制转到循环后的下一个命令或指令。

比如,下面的循环只会打印从 1 到 3:

for ((i=1;i<=10;i++)); do
    echo $i
    if [ $i -eq 3 ]; then
        break
    fi
done

使用 continue 语句会跳过本次循环,继续执行下次循环。比如,下面脚本 odd.sh 只会打印从 1 到 10 之间的奇数,而跳过偶数:

#!/bin/bash
for ((i=0;i<=10;i++)); do
    if [ $(($i % 2)) -ne 1 ]; then
        continue
    fi
    echo $i
done

执行结果如下:

$ ./odd.sh
1
3
5
7
9

无限循环

无限循环是一个永远运行的循环,其循环条件始终为真。大多数情况下,无限循环是因为逻辑错误造成的bug。

例如,有人可能希望创建一个循环,以降序打印数字1到10,结果可能会错误地创建以下无限循环:

for ((i=10;i>0;i++)); do
    echo $i
done

上述错误是将 i 递增 1。要修复这个问题需要将递增改为递减 i--:

for ((i=10;i>0;i--)); do
echo $i
done

在某些情况下,我们可能希望有意创建无限循环,以等待系统满足外部条件。如下所示:

for ((;;)); do
[COMMANDS]
done

如果想要创建一个无限 while 循环,可参考如下:

while [ true ]; do
    [COMMANDS]
done
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    180

    文章

    7604

    浏览量

    136692
  • 循环
    +关注

    关注

    0

    文章

    92

    浏览量

    15973
  • 脚本
    +关注

    关注

    1

    文章

    389

    浏览量

    14858
  • Bash
    +关注

    关注

    0

    文章

    57

    浏览量

    10179
收藏 人收藏

    评论

    相关推荐

    开发人员必须具备的Bash脚本知识

    您可以使用 Bash 脚本自动执行各种任务。掌握基础知识并开始您的 Bash 脚本之旅。
    发表于 09-27 09:09 424次阅读

    bash脚本检查子字符串的方法

    我们在写 bash 脚本的时候,假如有一个字符串,我们想检查其中是否包含另一个子字符串,那这个时候需要怎样做呢?
    发表于 11-24 15:25 1619次阅读
    <b class='flag-5'>bash</b><b class='flag-5'>脚本</b><b class='flag-5'>中</b>检查子字符串的方法

    bash脚本的test命令详解

    bash 脚本的 test  命令用于检查表达式的有效性,检查命令或表达式为 true 或者 false。此外,它还可以用于检查文件的类型和权限。
    发表于 11-24 15:32 3767次阅读
    <b class='flag-5'>bash</b><b class='flag-5'>脚本</b><b class='flag-5'>中</b>的test命令详解

    如何在bash shell脚本中使用变量

    如果你使用编程语言编写过程序,那么一定接触过变量。而在 bash 脚本的编写时,变量也是一个很重要的概念。今天我们分享一下如何在 bash 脚本中使用变量。
    发表于 12-02 16:32 2105次阅读
    如何在<b class='flag-5'>bash</b> shell<b class='flag-5'>脚本</b>中使用变量

    如何通过命令行将变量以参数的形式传递给bash脚本

    我们在上一篇文章中介绍了如何在 bash 脚本中使用变量,可以响应各种数据以及接收用户输入。
    发表于 12-02 16:38 1374次阅读
    如何通过命令行将变量以参数的形式传递给<b class='flag-5'>bash</b><b class='flag-5'>脚本</b>

    高级Bash 脚本编程指南

    高级Bash 脚本编程指南
    发表于 10-26 08:33 7次下载
    高级<b class='flag-5'>Bash</b> <b class='flag-5'>脚本</b>编程指南

    命令行重度用户需要的实用BASH脚本

    今天,我偶然发现了一组适用于命令行重度用户的实用 BASH 脚本,这些脚本被称为 Bash-Snippets,它们对于那些整天都与终端打交道的人来说可能会很有帮助。
    的头像 发表于 08-30 10:37 2601次阅读

    虚拟机:Bash Shell脚本打印出执行的命令

    默认情况下,bash脚本不会打印执行的每个命令,这个有时候不太方面。
    的头像 发表于 06-22 14:44 4546次阅读

    Raspberry Pi Bash Shell 脚本简介

      抛开潜在的麻烦不谈,Bash 可以是一个非常强大的工具,让您可以自动执行各种任务。在即将发表的文章,我将展示如何使用 Bash 脚本以及一些硬件技巧来自动化我的 Raspberr
    的头像 发表于 08-15 15:08 1192次阅读
    Raspberry Pi <b class='flag-5'>Bash</b> Shell <b class='flag-5'>脚本</b>简介

    如何在bash shell脚本接受参数

    终端命令通常包含一些参数,在使用的时候可以提供不同的参数来确定命令的执行方式。POSIX规范包含了用于命令行接口的选项。这也是与最早的UNIX应用程序建立的一个由来已久的约定,所以当你在写bash脚本的时候,需要知道如何在
    的头像 发表于 12-09 17:34 2707次阅读

    bash如何创建函数

    当你的 bash 脚本中代码非常多的时候,会看起来很混乱,其中有部分代码有可能是重复的。这个时候,可以使用函数来避免重复的代码。
    的头像 发表于 12-14 17:31 1152次阅读

    Bash脚本特殊变量$0是什么?

    Bash 脚本,`$0` 是一个特殊变量,它代表当前脚本的路径和名称。这个变量用于表示脚本自身,它是
    的头像 发表于 05-12 14:41 1841次阅读

    BASH shell脚本篇—条件命令

    这篇文章介绍下BASH shell的条件相关的命令,包括:if, case, while, until, for, break, continue。
    的头像 发表于 10-11 15:21 617次阅读
    <b class='flag-5'>BASH</b> shell<b class='flag-5'>脚本</b>篇—条件命令

    BASH shell脚本篇—函数

    函数是代码重用的最重要方式。Bash函数可以定义为一组命令,在bash脚本多次调用。
    的头像 发表于 10-20 16:31 1098次阅读

    BASH shell脚本篇—文件处理介绍

    Bash Shell脚本,可以使用多种方法来对文件进行操作,包括读取文件或写入文件。
    的头像 发表于 10-23 16:51 620次阅读