Bash For 循环

2023-11-11

循环是编程语言的基本概念之一。当您想要一遍又一遍地运行一系列命令直到达到特定条件时,循环会很方便。

在 Bash 等脚本语言中,循环对于自动执行重复任务非常有用。

Bash 脚本中有三种基本的循环结构,for loop, while 循环 , and 直到循环 .

在本教程中,我们将介绍 Bash 中 for 循环的基础知识。我们还将向您展示如何使用break and continue语句来改变循环的流程。

标准狂欢for Loop #

The for循环遍历项目列表并执行给定的命令集。

狂欢for循环采用以下形式:

for item in [LIST]
do
  [COMMANDS]
done

该列表可以是一系列由空格分隔的字符串、数字范围、命令的输出、数组等。

循环字符串#

在下面的示例中,循环将迭代字符串列表中的每个项目以及变量element将被设置为当前项目:

for element in Hydrogen Helium Lithium Beryllium
do
  echo "Element: $element"
done

该循环将产生以下输出:

Element: Hydrogen
Element: Helium
Element: Lithium
Element: Beryllium

循环一个数字范围#

您可以使用序列表达式指定一个范围通过定义范围的起点和终点来表示数字或字符。序列表达式采用以下形式:

{START..END}

下面是一个迭代 0 到 3 之间所有数字的示例循环:

for i in {0..3}
do
  echo "Number: $i"
done
Number: 0
Number: 1
Number: 2
Number: 3

从 Bash 4 开始,使用范围时也可以指定增量。该表达式采用以下形式:

{START..END..INCREMENT}

下面的示例展示了如何递增 5:

for i in {0..20..5}
do
  echo "Number: $i"
done
Number: 0
Number: 5
Number: 10
Number: 15
Number: 20

循环数组元素#

您还可以使用for循环遍历元素数组。

在下面的示例中,我们定义了一个名为BOOKS并迭代数组的每个元素。

BOOKS=('In Search of Lost Time' 'Don Quixote' 'Ulysses' 'The Great Gatsby')

for book in "${BOOKS[@]}"; do
  echo "Book: $book"
done
Book: In Search of Lost Time
Book: Don Quixote
Book: Ulysses
Book: The Great Gatsby

C 风格的 Bash for 循环#

C 风格的语法for循环采用以下形式:

for ((INITIALIZATION; TEST; STEP))
do
  [COMMANDS]
done

The INITIALIZATION循环开始时,部分仅执行一次。然后,TEST部分进行评估。如果为假,则循环终止。如果TEST是真的,体内的命令for循环被执行,并且STEP部分已更新。

在下面的示例代码中,循环通过初始化开始i = 0,并且在每次迭代之前检查是否i ≤ 10。如果是真的的话prints当前值i和[增加变量]i by 1 (i++) 否则循环终止。

for ((i = 0 ; i <= 1000 ; i++)); do
  echo "Counter: $i"
done

该循环将迭代 1001 次并产生以下输出:

Counter: 0
Counter: 1
Counter: 2
...
Counter: 998
Counter: 999
Counter: 1000

break and continue声明#

The 中断和继续语句可以用来控制for循环的执行。

break陈述#

The break语句终止当前循环并将程序控制传递给终止语句后面的语句。它通常用于在满足某个条件时终止循环。

在下面的示例中,我们使用if 语句一旦当前迭代项等于“Lithium”,就终止循环的执行。

for element in Hydrogen Helium Lithium Beryllium; do
  if [[ "$element" == 'Lithium' ]]; then
    break
  fi
  echo "Element: $element"
done

echo 'All Done!'
Element: Hydrogen
Element: Helium
All Done!

continue陈述#

The continue语句退出循环的当前迭代并将程序控制传递给循环的下一次迭代。

在下面的示例中,我们将迭代一系列数字。当当前迭代项等于‘2’时,continue语句将导致执行返回到循环的开头并继续下一次迭代:

for i in {1..5}; do
  if [[ "$i" == '2' ]]; then
    continue
  fi
  echo "Number: $i"
done
Number: 1
Number: 3
Number: 4
Number: 5

Bash for循环示例#

重命名文件名中包含空格的文件#

以下示例显示如何通过将空格替换为下划线来重命名当前目录中名称中包含空格的所有文件:

for file in *\ *; do
  mv "$file" "${file// /_}"
done

让我们逐行分解代码:

  • 第一行创建一个for循环并迭代名称中包含空格的所有文件的列表。表达方式*\ *创建列表。
  • 第二行适用于列表中的每一项,并将文件移动到新文件,用下划线替换空格 (_)。那个部分${file// /_}正在使用shell参数扩展用字符串替换参数中的模式。
  • done表示循环段的结束。

更改文件扩展名#

以下示例展示了如何使用 Bashfor循环到重命名所有文件通过将文件扩展名从 .jpeg 替换为 .jpg,在当前目录中以 .jpeg 结尾。

for file in *.jpeg; do
    mv -- "$file" "${file%.jpeg}.jpg"
done

我们逐行分析一下代码:

  • 第一行创建一个for循环并迭代以“.jpeg”结尾的所有文件的列表。
  • 第二行适用于列表中的每一项,并将文件移动到新文件,将“.jpeg”替换为“.jpg”。${file%.jpeg}使用以下命令从文件名中删除“.jpeg”部分shell参数扩展
  • done表示循环段的结束。

结论#

狂欢for循环用于重复执行一组给定的命令固定次数。

如果您有任何问题或反馈,请随时发表评论。

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

Bash For 循环 的相关文章

  • 从 pod 安装库时出现错误

    我收到未定义的方法squish for
  • 找不到 NGINX brew 安装命令

    I do brew install nginx and get gt Downloading http nginx org download nginx 1 2 2 tar gz Already downloaded Library Cac
  • 如何在 mac 中使用“getopt”命令让 bash 处理长参数?

    我想让我的 bash 脚本处理长参数 我发现getopt 但 OS X 不支持它 谁能告诉我为什么getoptBSD 实现了 GNU 没有实现 我尝试构建getopt在 GNU C lib 中 但由于我对 Linux 的技能不佳而失败了 有
  • 使用 mkfifo 和传输流,这可能吗?

    我想执行一个 bash 脚本来执行以下操作 应用程序 ffmpeg 生成实时传输流 ts 文件 我需要处理这个实时流 执行解复用等 现在我知道这必须通过 FIFO 来完成 但这是我的任务 我需要重定向 ffmpeg 的输出以写入 fifo
  • 如何从 powershell 中设置 bash 的环境变量?

    使用powershell我该如何设置 https askubuntu com q 1205227 45156 the 环境 https stackoverflow com q 5327495 262852变量 这里 特别 https sta
  • 别名在 Bash 脚本中不起作用[重复]

    这个问题在这里已经有答案了 我有一个可执行文件command sh bin bash alias my command echo ok my command 我的终端是bash 当我像这样运行时 command sh 效果很好 当我像这样运
  • CentOS目录结构是树形的吗?

    CentOS 上有相当于树的东西吗 如果你的 Centos 系统上没有安装 tree 无论如何我通常建议服务器设置使用最小安装磁盘 你应该在命令行中输入以下内容 yum install tree y 如果没有安装 那是因为您没有正确的存储库
  • “grep -q”的意义是什么

    我正在阅读 grep 手册页 并遇到了 q 选项 它告诉 grep 不向标准输出写入任何内容 如果发现任何匹配 即使检测到错误 也立即以零状态退出 我不明白为什么这可能是理想或有用的行为 在一个程序中 其原因似乎是从标准输入读取 处理 写入
  • Bash 脚本:#!/bin/bash 是什么意思? [复制]

    这个问题在这里已经有答案了 在 bash 脚本中 什么是 bin bash第一行是什么意思 UPDATE 有区别吗 bin bash and bin sh 这就是所谓的shebang http en wikipedia org wiki S
  • 如何显示 NUL 分隔数据的中间管道结果?

    如何组合以下两个命令 find print0 grep z pattern tr 0 n find print0 grep z pattern xargs 0 my command 进入单个管道 如果我不需要 NUL 分隔符那么我可以这样做
  • touch命令在一个目录下创建多个文件(不同名称)

    我想制作一个在 bash 中创建目录和文件结构的脚本 我尝试过这样的事情 mkdir p 1 2 touch 1 2 a b c a b c 应该是在一个命令或其他命令中创建的文件 但由于某种原因 结构是这样的 current folder
  • 如何替换“docker run”命令中的变量值

    我正在使用 bash 脚本并尝试分配指纹值 如下所示 export FINGERPRINT D0 19 C5 80 42 66 56 AC 6F docker run rm i v var run docker sock var run d
  • 为什么减法返回 - 符号

    我对简单的减法有疑问 但我不明白出了什么问题 我的代码 start date s N cut b1 13 Treatment end date s N cut b1 13 delta expr end start echo delta de
  • 如何剪切(1) 个驼峰字?

    Bash 中有没有一种简单的方法可以将驼峰式单词拆分为其组成词 例如 我想将 aCertainCamelCasedWord 拆分为 a certain Camel Cased Word 并能够选择我感兴趣的那些字段 当单词分隔符是下划线时
  • 我的 unix 脚本出了什么问题

    bin bash while echo n Player s name read name name ZZZ do searchresult grep name playername if searchresult 0 then echo
  • 设置 Pyenv 的路径

    我正在尝试在我的服务器中设置 Pyenv 的加载路径 bashrc file 我正在关注这个tutorial https realpython com intro to pyenv 它要求我们在哪里设置pyenv到加载路径 然而 在我的 b
  • apt-get install tzdata 非交互式

    当我尝试 apt get install y tzdata 将显示用于选择时区的命令行选项 我试图在脚本中使用它来进行一些设置 如何在没有用户输入的情况下使 apt get 运行 我知道重新配置 tzdata 我可以做 echo Ameri
  • 将“npm run start”的输出写入文件

    我想捕获的输出npm run start在一个文件中 我遇到了大量错误 我想更好地控制如何筛选输出 当我尝试时 npm run start gt log txt 我得到一个非常简短的文件 8 行 其结尾为 34m 39m 90m wdm 3
  • 如何将参数传递给java bash脚本? [复制]

    这个问题在这里已经有答案了 我有一个简单的 bash 脚本来运行我的 java 程序 就这个 run sh bin sh java jar target my jar arch jar 我想将参数传递给这个脚本 该脚本必须将它们传递给jav
  • bash 变量中的 Linux 鞭尾/对话框参数错误

    有人可以解释为什么下面的代码不起作用吗 我要疯狂地想找出答案 bin bash TEST M1 1 wire Interface ON echo TEST RESULT dialog title Config Modules State c

随机推荐

  • 10 个适合旧电脑的最佳轻量级 Linux 发行版

    随着计算机的老化 其性能不可避免地会下降 操作系统的响应速度也会降低 对于想要继续使用旧硬件但受到可用资源限制的用户来说 这可能会令人沮丧 幸运的是 Linux 提供了各种针对旧计算机进行优化的轻量级发行版 使它们能够更流畅 更高效地运行
  • 如何在 CentOS/RHEL 7 和 Fedora 上安装 Python 3.9

    Python 是一种非常流行 用途广泛且易于学习的编程语言 广泛应用于从 Web 开发和数据分析到人工智能和机器学习的各个行业和应用程序 Python 3 9 是该语言的最新版本之一 提供了改进的性能和许多新功能 在本教程中 我们将指导您完
  • 如何在 Linux 上的 VirtualBox 中从 USB 驱动器启动

    使用 USB 启动物理机要容易得多 但 VirtualBox 不提供直接选择从 USB 启动的方法 因此 如果您有可启动 USB 驱动器 那么本文将帮助您了解如何使用可启动 USB 创建 VirtualBox 虚拟机 对于这个例子 我已经创
  • 如何在 Debian 9 Stretch 上安装 PHP(7.4、7.3 和 5.6)

    PHP 7 4 是可在 Debian 9 Stretch Linux 计算机上安装的最新版本 Ubuntu 用户可以访问我们的教程在 Ubuntu 上安装 PHP 7 本教程适用于 Debian 9 Stretch 用户在其系统上安装 PH
  • 如何在Linux终端上访问远程邮箱

    Linux 系统有大量的图形电子邮件客户端 您可以轻松安装它们以通过 POP IMAP 协议访问远程系统的邮箱 对于没有GUI界面的Linux服务器版本可以使用命令行邮件客户端访问远程邮箱 本教程将帮助您在Linux终端上使用POP IMA
  • Bash – 如何获取未来的日期和时间

    Linuxdate命令显示系统的当前日期和时间 在编写 shell 脚本时 我意识到有时我们需要查找未来的日期 例如 10 天 2 个月或 1 年之后的日期等 date 命令提供了一个选项来显示未来的日期 如所述 d date STRING
  • Magento 2 代码库和数据库备份脚本

    本教程将帮助您使用 shell 脚本自动执行 Magento2 代码库和数据库备份过程 该脚本将按计划的时间间隔执行自动备份 该脚本还能够根据配置删除较旧的备份 设置Magerun2 您需要在系统上下载并配置 Magerun2 脚本 wge
  • 如何使用 Mysqlcheck 检查和修复 MySQL 表

    数据库管理系统是现代软件应用程序无缝运行不可或缺的一部分 MySQL 是世界上使用最广泛的关系数据库管理系统之一 随着数据库的增长和发展 确保其中表的完整性 性能和运行状况至关重要 这就是 Mysqlcheck 发挥作用的地方 1 Mysq
  • 如何在 Ubuntu 20.04 上使用 VSFTPD 设置 FTP 服务器

    本文介绍如何在 Ubuntu 20 04 上安装和配置 FTP 服务器 用于在设备之间共享文件 FTP 文件传输协议 是一种标准网络协议 用于在远程网络之间传输文件 有多种可用于 Linux 的开源 FTP 服务器 最知名和最广泛使用的是P
  • 如何在 Ubuntu 20.04 上添加交换空间

    交换空间是磁盘上的空间 当物理 RAM 内存已满时使用 当 Linux 系统耗尽 RAM 时 非活动页面将从 RAM 移至交换空间 交换空间可以采用专用交换分区或交换文件的形式 通常 在虚拟机上运行 Ubuntu 时 不存在交换分区 唯一的
  • 如何在 Debian 9 上安装和配置 Redmine

    Redmine 是一款免费的开源项目管理和问题跟踪应用程序 它是跨平台和跨数据库的 构建在 Ruby on Rails 框架之上 Redmine包括对多个项目 wiki 问题跟踪系统 论坛 日历 电子邮件通知等的支持 在本教程中 我们将向您
  • 如何在 Debian 10 上设置 WireGuard VPN

    WireGuard 是一种通用 VPN 虚拟专用网络 采用最先进的加密技术 与其他流行的 VPN 解决方案 例如 IPsec 和 相比OpenVPN 线卫通常速度更快 更容易配置并且占用空间更小 它是跨平台的 几乎可以在任何地方运行 包括
  • 如何在 Ubuntu 20.04 上安装 Plex 媒体服务器

    Plex 是一款流媒体服务器 可让您组织视频 音乐和照片集 并将媒体随时随地流式传输到计算机 手机 平板电脑或电视 Plex 媒体服务器可以安装在所有主要操作系统和设备上 本文介绍了如何安装Plex 媒体服务器在 Ubuntu 20 04
  • 如何在 Debian 9 上使用 Apache 安装和保护 phpMyAdmin

    phpMyAdmin 是一个免费 开源的基于 PHP 的应用程序 旨在通过基于 Web 的界面简化 MySQL 和 MariaDB 服务器的管理 phpMyAdmin 允许您管理 MySQL 数据库 用户帐户和权限 执行 SQL 语句 以各
  • 在 Linux 中查找大文件

    随着时间的推移 您的磁盘驱动器可能会因大量不必要的文件而变得混乱 占用大量磁盘空间 通常 Linux 系统会因日志或备份文件过大而耗尽磁盘空间 本教程介绍如何使用以下命令查找 Linux 系统中最大的文件和目录find and du命令 使
  • 如何在 Debian 10 上安装 Apache Maven

    Apache Maven 是一个开源项目管理和理解工具 主要用于 Java 项目 Maven 使用项目对象模型 POM 它本质上是一个 XML 文件 其中包含有关项目 配置详细信息 项目依赖项等的信息 本文展示了在 Debian 10 上安
  • 如何在 Linux 中删除/移除用户(userdel 命令)

    Linux 是一个多用户系统 这意味着多个人可以同时与同一个系统交互 作为系统管理员 您有责任通过以下方式管理系统的用户和组创建新用户并将它们分配给不同的groups 有时 您可能需要删除用户帐户 也许是因为用户离开了组织 或者它是为不再在
  • 如何在 CentOS 7 上设置 Nginx 服务器块

    Nginx Server Blocks 允许您在一台机器上运行多个网站 这很有用 因为对于每个站点 您可以指定站点文档根 包含网站文件的目录 创建单独的安全策略 使用不同的 SSL 证书等等 在本教程中 我们将解释如何在 CentOS 7
  • 如何在 Ubuntu 20.04 上安装 VirtualBox

    虚拟盒子是开源跨平台虚拟化软件 允许您同时运行多个来宾操作系统 虚拟机 一般来说 Virtualbox 被桌面用户用作测试和开发环境 在本教程中 我们将向您展示在 Ubuntu 20 04 上安装 VirtualBox 的两种方法 来自标准
  • Bash For 循环

    循环是编程语言的基本概念之一 当您想要一遍又一遍地运行一系列命令直到达到特定条件时 循环会很方便 在 Bash 等脚本语言中 循环对于自动执行重复任务非常有用 Bash 脚本中有三种基本的循环结构 for loop while 循环 and