Shell 教程:编写 BASH 'for'循环的正确姿势

系统 Linux
在编程或脚本语言中,Bash 提供了几种重复代码的方法 - 称为循环的过程 - 其中 for 循环重复代码的某个部分。这允许运行一系列命令,直到满足特定条件。在本指南中,我们将向您介绍如何编写 Bash for 循环。

本文我们要学会什么

  • 在 Bash for循环中, do和done之间的所有语句对列表或数字范围中的每个项目执行一次。
  • 对于大列表,使用in {list} 在起点和终点之间循环。使用省略号迭代整个数字范围,例如{1..10} 中的数字。
  • 要跳过某些数字,请在范围内添加第三个数字。例如,使用{0..100..10}仅列出每 10 个数字。

在编程或脚本语言中,Bash 提供了几种重复代码的方法 - 称为循环的过程 - 其中 for 循环重复代码的某个部分。这允许运行一系列命令,直到满足特定条件。在本指南中,我们将向您介绍如何编写 Bash for 循环。

如何循环遍历列表

诸如 Bash 之类的脚本语言具有与其他语言相似的编程结构。例如,导入参数从键盘获取输入并将这些输入存储为变量,然后根据输入参数的值执行特定操作。

下面是一个名为linuxmi.sh 的简单示例脚本:

#!/bin/bash
for number in 1 2 3 4 5
do
echo $number
done
exit 0

Bash 使用for循环的方式与其他编程和脚本语言处理for循环的方式有些不同。让我们分解脚本。

在 BASH for循环中,do和done之间的所有语句对列表中的每个项目都执行一次。在此示例中,列表是in单词之后的所有内容— 数字1 2 3 4 5。

每次循环迭代时,列表中的下一个值将插入到单词for之后指定的变量中。在上面的循环中,变量被称为number。

echo语句 在屏幕上显示信息。因此,此示例采用数字 1 到 5,并将每个数字一一输出到屏幕:

如何在起点和终点之间循环

这个 linuxmi.sh 脚本的问题在于,如果您想处理一个更大的列表(例如,1 到 500),则键入所有数字将花费很长时间。相反,指定一个起点和终点就简单了:

#!/bin/bash
for number in {1..10}
do
echo "$number "
done
exit 0

规则是一样的。in这个词后面的值组成了要迭代的列表,列表中的每个值都放在变量(即number)中,每次循环迭代时,都会执行do和done之间的语句。

主要区别在于列表的形成方式。大括号表示一个范围,在本例这种情况下,范围是 1 到 10(两个点分隔范围的开始和结束)。

因此,此示例遍历 1 到 10 之间的每个数字并将该数字输出到屏幕。如下:

相同的循环可以这样编写,语法与第一个示例相同:

for number in 1 2 3 4 5 6 7 8 9 10

如何跳过范围内的数字

前面的示例展示了如何在起点和终点之间循环。以下是如何跳过范围内的数字。

例如,要在 0 和 100 之间循环,但只显示 10 的倍数的数字,请使用以下脚本获取此输出:

#!/bin/bash
for number in {0..100..10}
do
echo "$number "
done
exit 0

规则是一样的。在do和done之间有一个列表、一个变量和一组要执行的语句。这次的列表如下所示:{0..100..10}。

大括号中第一个数字是 0,结束数字是 100。第三个数字 (10) 是列表中将跳过的项目数。

因此,上面的示例显示以下输出:

一个实际的例子

For 循环不仅仅迭代数字列表。例如,使用其他命令的输出作为列表。

以下示例显示如何将音频文件从MP3转换为WAV:

#!/bin/bash
for file in ./*.mp3
do
mpg -w ./wavs/"${file}".wav "$file"
done

此示例中的列表是当前文件夹中每个扩展名为 .MP3 的文件,变量是一个文件。

mpg 命令将 MP3 文件转换为 WAV。但是,您可能需要先使用包管理器安装此工具。

责任编辑:庞桂玉 来源: Linux公社
相关推荐

2021-04-02 12:37:53

RestfulAPI接口架构

2021-10-08 08:38:00

Pipelineshell命令Jenkins

2016-05-09 10:41:03

算法分析开发

2017-02-23 15:37:44

OptionObject容器

2018-01-11 15:31:39

命令Linux关机

2017-07-10 13:09:45

前端Flexbox

2017-03-16 11:39:33

Openstack源码姿势

2023-01-30 07:41:43

2022-03-24 08:57:30

Linux BashShell代码

2019-12-27 15:58:57

大数据IT互联网

2016-12-12 08:48:24

2024-09-25 08:22:06

2021-09-15 16:20:02

Spring BootFilterJava

2017-10-12 11:30:34

Spark代码PR

2021-01-08 08:10:34

MySQL表空间回收

2019-10-30 17:06:50

AWS物联网IoT

2019-01-02 10:49:54

Tomcat内存HotSpot VM

2016-01-05 11:28:20

按需付费云计算docker

2017-06-19 17:43:04

网络带宽网络设计

2020-02-24 15:26:40

Python短信免费
点赞
收藏

51CTO技术栈公众号