Bash For 循环:Linux 中的迭代指南

2023-10-18

Bash 中的 for 循环是重要的控制结构,用于脚本编写重复任务。它们提供多次执行一系列命令、循环范围、变量、命令输出等的能力。

这个综合教程将带您了解在 Bash 中使用 for 循环的各种方法。

从基本语法到更高级的主题,例如嵌套循环和动态序列生成。

 

 

基本语法

Bash 中的 for 循环通常遵循以下语法:


for VARIABLE in ELEMENT_1 ELEMENT_2 ... ELEMENT_N
do
    COMMAND1
    COMMAND2
    ...
done
  

在这里,循环迭代元素并执行之间包含的命令do and done.
现在,如果您运行这个简单的示例:


for i in 1 2 3
do
   echo $i
done
  

Output:


1
2
3
  

在此代码中,循环迭代 3 次,设置变量i每次迭代中分别为值 1、2 和 3。然后它打印的值i,产生上述输出。

 

迭代数字序列

在 Linux Bash 中,您可以轻松地迭代数字序列。就是这样:


for number in {1..5}
do
   echo $number
done
  

Output:


1
2
3
4
5
  

循环运行五次,变量number依次取1到5的值。这回显命令逐行打印这些值。

 

带范围的 For 循环

您可以使用以下语法在 Bash 中创建具有指定范围的循环{START..END..INCREMENT}。这是一个例子:


for number in {0..10..2}
do
   echo $number
done
  

Output:


0
2
4
6
8
10
  

此循环以 2 为增量迭代从 0 到 10 的数字。变量number按顺序分配这些值,并逐行打印它们。

阅读更多内容Bash for 循环范围.

 

迭代字符串

在 Bash 中迭代字符串非常简单。这是一个例子:


for string in "apple" "banana" "cherry"
do
   echo $string
done
  

Output:


apple
banana
cherry
  

这里,循环迭代三次,每次为变量分配不同的水果名称string。因此,它会打印这些水果名称。

 

迭代命令输出

您可以迭代 Bash 中命令的输出。以下是列出目录中所有文本文件的方法:


for file in $(ls *.txt)
do
   echo $file
done
  

Output:


file1.txt
file2.txt
file3.txt
  

循环运行ls *.txt命令并获取目录中所有文本文件的名称。

变量file然后依次获取每个文件名,并且echo命令打印它们。

 

循环文件和目录

以下是列出当前文件夹中所有目录的示例:


for dir in */
do
   echo $dir
done
  

Output:


dir1/
dir2/
dir3/
  

在这种情况下,循环遍历当前文件夹中的所有目录,由尾部斜杠表示*/.

变量dir依次取每个目录名的值,然后echo命令打印它们。

阅读更多关于如何Linux 中使用 for 循环迭代文件.

 

循环控制语句

循环控制语句有助于控制循环内的流程。

break

终止循环。例子:


for number in {1..5}
do
   if [ $number -eq 3 ]; then
      break
   fi
   echo $number
done
  

Output:


1
2  

循环退出时number等于 3,导致仅打印 1 和 2。

continue

跳到下一次迭代。例子:


for number in {1..5}
do
   if [ $number -eq 3 ]; then
      continue
   fi
   echo $number
done
  

Output:


1
2
4
5  

循环跳过打印 3 并继续打印其他数字。

exit

退出整个脚本。例子:


for number in {1..5}
do
   if [ $number -eq 3 ]; then
      exit
   fi
   echo $number
done
  

Output:


1
2  

整个脚本终止时number等于 3,并且不再执行任何代码。

 

嵌套 For 循环

嵌套 for 循环由另一个循环中的一个或多个循环组成。下面是一个使用两个嵌套循环创建乘法表的示例:


for i in {1..3}
do
   for j in {1..3}
   do
      echo -n "$((i * j)) "
   done
   echo
done
  

Output:


1 2 3 
2 4 6 
3 6 9
  

这里,外循环迭代数字 1 到 3,内循环也做同样的事情。

在内循环内部,变量的乘积i and j打印出来,创建一个 3×3 乘法表。

 

动态生成循环序列(使用 seq)

您可以使用顺序命令动态生成 for 循环序列。这是一个例子:


for number in $(seq 1 2 9)
do
   echo $number
done
  

Output:


1
3
5
7
9
  

在这里,seq 1 2 9命令生成从 1 到 9 的数字序列,递增 2。

循环迭代这些数字,逐行打印它们。

 

无限 Bash for 循环

无限循环无限期地继续,没有终止条件。这是一个简单的例子:


for (( ; ; ))
do
   echo "This is an infinite loop."
   sleep 1
done
  

Output:


This is an infinite loop.
This is an infinite loop.
...
  

何时使用无限循环:无限循环对于需要继续而不停止的任务非常有用,例如监视系统进程或等待特定事件。
如何阻止它:要停止无限循环,可以使用终止命令,如 CTRL+C。
必须谨慎使用无限循环,因为如果管理不当,它们可能会消耗系统资源。

 

C-Style

Bash 支持 C 风格的 for 循环,为熟悉 C 编程的人提供了熟悉的语法。下面是一个示例:


for (( i=0; i<3; i++ ))
do
   echo "Iteration number $i"
done
  

Output:


Iteration number 0
Iteration number 1
Iteration number 2
  

这个循环开始于i设置为 0 并继续i小于 3,递增i每次迭代时加 1。它打印每个值的迭代次数i.

 

Using $@ & $*

在巴什中,$@ and $*是处理命令行参数的特殊变量,它们可以在循环中使用。就是这样:


for arg in "$@"
do
   echo $arg
done
  

输出(如果使用以下命令调用脚本./script.sh one two three):


one
two
three  

$@将每个参数视为一个单独的单词,循环将它们一一打印。

Using $*:


for arg in "$*"
do
   echo $arg
done
  

输出(如果使用以下命令调用脚本./script.sh one two three):


one two three  

$*将所有参数视为单个字符串,因此循环将它们打印在一行上。

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

Bash For 循环:Linux 中的迭代指南 的相关文章

  • 如何不断刷新屏幕并实时更新[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想在linux上写一个C程序 不断刷新屏幕并实时更新 例如类似于top终端中的命令 谁能指出我正确的方向 为了保持它跨终端类型的可移
  • 在 Ubuntu 16.04 上找不到 printf.c

    我最近切换到Ubuntu 16 04 我在用vscode作为 Ubuntu 上的 IDE 我配置了其他语言 但我无法做到这一点C C 我创建c cpp properties json launch json tasks json 当我开始编
  • 从 TypeScript 运行任何 Linux 终端命令?

    有没有办法直接从 TypeScript 类中执行 Linux 终端命令 这个想法是做类似的事情 let myTerminal new LinuxTerminal let terminalResult myTerminal run sudo
  • 从多线程程序中调用 system()

    我们正在开发一个用 C 编写的多线程内存消耗应用程序 我们必须执行大量的 shellscript linux 命令 并获取返回码 读完之后article http www linuxprogrammingblog com threads a
  • 如何在特定 systemd 服务重新启动时触发自定义脚本运行

    我想知道如何安排自定义脚本在重新启动服务时运行 我的用例是 每当重新启动 Tomcat 服务时 我都必须运行多个命令 我想知道是否有一种方法可以编写脚本并安排它在重新启动 Tomcat 服务时运行 我已将 tomcat 脚本设置为 syst
  • 如何查找连接到 AF_INET 套接字的客户端的 UID?

    有什么方法或类似的东西ucred for AF UNIX如果是AF INET插座 TCP在我的例子中 找出连接到我的套接字的客户端的UID 还有 proc net tcp但它显示了UID of the creator插座的而不是连接的cli
  • 归档文件系统或格式

    我正在寻找一种文件类型来存储已退役系统的档案 目前 我们主要使用 tar gz 但从 200GB tar gz 存档中查找并提取几个文件是很麻烦的 因为 tar gz 不支持任何类型的随机访问读取规定 在你明白之前 使用 FUSE 安装 t
  • arm-linux-gnueabi 编译器选项

    我在用 ARM Linux gnueabi gcc在 Linux 中为 ARM 处理器编译 C 程序 但是 我不确定它编译的默认 ARM 模式是什么 例如 对于 C 代码 test c unsigned int main return 0x
  • 在 Linux 上的 Python 中使用受密码保护的 Excel 工作表

    问题很简单 我每周都会收到一堆受密码保护的 Excel 文件 我必须解析它们并使用 Python 将某些部分写入新文件 我得到了文件的密码 当在 Windows 上完成此操作时 处理起来很简单 我只需导入 win32com 并使用 clie
  • 如何模拟ARM处理器运行环境并加载Linux内核模块?

    我尝试加载我的vmlinux into gdb并使用 ARM 内核模拟器 但我不明白为什么我会得到Undefined target command sim 这是外壳输出 arm eabi gdb vmlinux GNU gdb GDB 7
  • 修改linux下的路径

    虽然我认为我已经接近 Linux 专业人士 但显然我仍然是一个初学者 当我登录服务器时 我需要使用最新版本的R 统计软件 R 安装在 2 个地方 当我运行以下命令时 which R I get usr bin R 进而 R version
  • bluetoothctl 到 hcitool 等效命令

    在 Linux 中 我曾经使用 hidd connect mmac 来连接 BT 设备 但自 Bluez5 以来 这种情况已经消失了 我可以使用 bluetoothctl 手动建立连接 但我需要从我的应用程序使用这些命令 并且使用 blue
  • 为什么我收到“无法进行二进制日志记录”的信息。在我的 MySQL 服务器上?

    当我今天启动 MySQL 服务器并尝试使用以下命令进行一些更改时用于 MySQL 的 Toad http www quest com toad for mysql 我收到此消息 MySQL 数据库错误 无法进行二进制日志记录 消息 交易级别
  • 在 Linux 上更快地分叉大型进程?

    在现代 Linux 上达到与 Linux 相同效果的最快 最好的方法是什么 fork execve combo 从一个大的过程 我的问题是进程分叉大约 500MByte 大 并且一个简单的基准测试只能从进程中实现约 50 个分叉 秒 比较最
  • 创建 jar 文件 - 保留文件权限

    我想知道如何创建一个保留其内容的文件权限的 jar 文件 我将源代码和可执行文件打包在一个 jar 文件中 该文件将在使用前提取 人们应该能够通过运行批处理 shell 脚本文件立即运行示例和演示 然后他们应该能够修改源代码并重新编译所有内
  • 抑制 makefile 中命令调用的回显?

    我为一个作业编写了一个程序 该程序应该将其输出打印到标准输出 分配规范需要创建一个 Makefile 当调用它时make run gt outputFile应该运行该程序并将输出写入一个文件 该文件的 SHA1 指纹与规范中给出的指纹相同
  • 如何检测并找出程序是否陷入死锁?

    这是一道面试题 如何检测并确定程序是否陷入死锁 是否有一些工具可用于在 Linux Unix 系统上执行此操作 我的想法 如果程序没有任何进展并且其状态为运行 则为死锁 但是 其他原因也可能导致此问题 开源工具有valgrind halgr
  • 如何使用 xterm.js 创建基于 Web 的终端以 ssh 进入本地网络上的系统

    我偶然发现了这个很棒的图书馆xterm js https xtermjs org 这也是 Visual Studio Code 终端的基础 我有一个非常普遍的问题 我想通过基于网络的终端 不在网络中 可能位于 aws 服务器上 访问本地网络
  • nginx 上的多个网站和可用网站

    通过 nginx 的基本安装 您的sites available文件夹只有一个文件 default 怎么样sites available文件夹的工作原理以及如何使用它来托管多个 单独的 网站 只是为了添加另一种方法 您可以为您托管的每个虚拟
  • 为什么 Linux perf 使用事件 l1d.replacement 来处理 x86 上的“L1 dcache misses”?

    在英特尔 x86 上 Linux用途 https stackoverflow com a 52172985 149138事件l1d replacements来实施其L1 dcache load misses event 该事件定义如下 计数

随机推荐

  • 如何在 Linux 中递归更改文件的权限

    如果您使用 Linux 作为主要操作系统或管理 Linux 服务器 您会遇到尝试创建或编辑文件并收到 权限拒绝 错误的情况 通常 与权限不足相关的错误可以通过设置正确的文件权限或所有权 Linux 是一个多用户系统 对文件的访问是通过文件权
  • 如何显示 MySQL 中所有数据库的列表

    给药时MySQL对于数据库服务器 您要做的最常见的任务之一就是熟悉环境 这涉及诸如列出驻留在服务器上的数据库等任务 显示表格特定数据库的信息或获取有关用户帐户及其权限的信息 本教程介绍如何通过命令行显示 MySQL 或 MariaDB 服务
  • 如何创建 Tar Gz 文件

    tar 存档是一个存储其他文件集合的文件 包括有关这些文件的信息 例如所有权 权限和时间戳 在 Linux 操作系统中 您可以使用tar创建 tar 档案的命令 该命令还可以使用各种压缩程序来压缩档案 其中 gzip 是最流行的算法 按照约
  • 如何在 Ubuntu 20.04 上安装 GCC (build-essential)

    GNU 编译器集合 GCC 是 C C Objective C Fortran Ada Go D 编程语言 很多开源项目 包括Linux内核和GNU工具 都是使用GCC编译的 本文介绍如何在 Ubuntu 20 04 上安装 GCC 在 U
  • 如何在 Debian 9 上安装和使用 FFmpeg

    FFmpeg 是一个免费的开源命令行工具 用于对多媒体文件进行转码 它包含一组共享的音频和视频库 例如libavcodec libavformat和libavutil 使用 FFmpeg 您可以在各种视频和音频格式之间进行转换 设置采样率以
  • 如何在 Ubuntu 18.04 上安装 Python 3.7

    Python 是世界上最流行的编程语言之一 凭借其简单易学的语法 Python 是初学者和经验丰富的开发人员的绝佳选择 Python 是一种非常通用的编程语言 它可以用作脚本语言来构建游戏 开发网站 创建机器学习算法和分析数据 Python
  • 如何在 CentOS 7 上安装 VLC 媒体播放器

    VLC 是一种流行的开源多媒体播放器和流媒体服务器 它是跨平台的 几乎可以播放所有多媒体文件以及 DVD 音频 CD 和不同的流媒体协议 本教程介绍如何在 CentOS 7 上安装 VLC 媒体播放器 先决条件 您需要以以下身份登录具有 s
  • 如何在 Ubuntu 20.04 上安装和使用 FFmpeg

    FFmpeg 是一个用于处理多媒体文件的免费开源工具集合 它包含一组共享的音频和视频库 例如libavcodec libavformat和libavutil 使用 FFmpeg 您可以在各种视频和音频格式之间进行转换 设置采样率 捕获流音频
  • Linux 睡眠命令(暂停 Bash 脚本)

    sleep是一个命令行实用程序 允许您将调用进程挂起指定的时间 换句话说 sleep命令将下一个命令的执行暂停给定的秒数 The sleep该命令在 bash shell 脚本中使用时非常有用 例如 在重试失败的操作或在循环内时 在本教程中
  • 如何在 Ubuntu 18.04 上安装 CouchDB

    CouchDB 是由 Apache 软件基金会维护的免费开源容错 NoSQL 数据库 CouchDB 服务器将其数据存储在命名数据库中 其中包含以下文档JSON结构 每个文档由许多字段和附件组成 字段可以包括文本 数字 列表 布尔值等 它包
  • 如何在 Debian 10 上安装 Xrdp 服务器(远程桌面)

    Xrdp 是 Microsoft 远程桌面协议 RDP 的开源实现 允许您以图形方式控制远程系统 使用 RDP 您可以登录到远程计算机并创建真实的桌面会话 就像登录到本地计算机一样 本教程介绍如何在 Debian 10 Linux 上安装和
  • 如何使用SFTP命令传输文件

    SFTP SSH 文件传输协议 是一种安全文件协议 用于通过加密的 SSH 传输访问 管理和传输文件 与传统的相比FTPSFTP 提供 FTP 的所有功能 但更安全且更易于配置 Unlike SCPSFTP 仅支持文件传输 但允许您对远程文
  • 15+ yum update 命令示例

    Yum 是 Red Hat CentOS 和其他操作系统上使用的包管理器Linux 发行版使用 RPM 包管理器 Yum 用于安装 更新 删除或以其他方式操作这些 Linux 系统上安装的软件包 在本教程中 我们将介绍 yum update
  • Seaborn barplot 教程(以条形图可视化您的数据)

    数据可视化已成为与分析数据进行交流的重要阶段 通过数据可视化 数据科学家和业务分析师可以轻松地从大量数据中提取见解 Seaborn 是一种 Python 中的统计图形绘图和可视化库 允许数据分析师和数据科学专业人员呈现可视化 在本文中 我们
  • 15 个 Linux 读取命令示例

    The readLinux 中的命令允许您从标准输入或文件中读取输入 它允许您接收数据并将其分配给变量 本教程将指导您完成不同的选项read命令 目录 hide 1 读取用户的输入 2 从文件中读取输入 3 指定分隔符
  • 创建和使用动态 Laravel 子域路由

    许多网站为用户的个人资料或页面提供了一个自定义子域 因此用户可以通过 http username website com 访问他的个人资料 这要好得多 在这篇文章中 我们将了解如何高效地进行动态 Laravel 子域路由 配置DNS 要做到
  • 使用 Pandas read_html 函数读取 HTML 表格

    您可以使用read html直接从网站抓取 HTML 表格并将其转换为数据框 它简化了从网页提取数据的过程 The read html函数接受一个包含 URL 或指向 HTML 文件的文件路径的字符串 提取该 HTML 页面中包含的所有表
  • Python SQLite3教程(数据库编程)

    在本教程中 我们将使用 Python 以编程方式使用 SQLite3 数据库 一般来说 SQLite 是一种无服务器数据库 您可以在包括 Python 在内的几乎所有编程语言中使用它 无服务器意味着无需安装单独的服务器即可使用 SQLite
  • Linux iptables 防火墙简化示例

    在上一篇文章中 我们讨论了如何使用强化最佳实践保护 Linux 服务器 有人问我防火墙部分 里面简单介绍了iptables防火墙 今天我们就来详细讨论一下Linux iptables 防火墙以及如何使用出色的防火墙来保护您的服务器流量 目录
  • Bash For 循环:Linux 中的迭代指南

    Bash 中的 for 循环是重要的控制结构 用于脚本编写重复任务 它们提供多次执行一系列命令 循环范围 变量 命令输出等的能力 这个综合教程将带您了解在 Bash 中使用 for 循环的各种方法 从基本语法到更高级的主题 例如嵌套循环和动