10 个带有解释的 Bash For 循环示例

循环结构,特别是 `for` 循环,在任何编程语言中都扮演着至关重要的角色。它允许程序按照指定的次数或条件重复执行代码块,有效地遍历数据集中的元素。

例如,当你需要处理一个包含“n”个元素的列表或数组时,`for` 循环就显得尤为重要。 考虑一个简单的色彩列表:

紫1 靛2 蓝3 绿4 彩虹表

若要对上述表格中的项目进行任何操作或迭代,就必须依赖 `for` 循环。

Bash 中的 For 循环

在 Bash 脚本中,`for` 循环的基本语法结构如下:

#!/bin/bash

for 变量 in 元素1 元素2 元素3 ... 元素N
do
  执行的动作1
  执行的动作2
  ...
done

Bash 的 `for` 循环结构清晰明了。 第一行 `#!/bin/bash` 指示这是一个 Bash 脚本。 变量 代表循环中使用的临时变量。 N 代表循环的最大迭代次数。 `do` 和 `done` 关键字分别标志着循环的开始和结束。 在循环体内,你可以指定任何需要执行的命令。

在 Bash 的 `for` 循环中,我们可以使用不同类型的变量,例如列表、字符串、整数和数组。 本文将深入探讨一些常见的 Bash `for` 循环的应用实例。

这些程序可以直接在 Bash 命令行中运行,也可以保存为文件,并通过 `Bash filename.sh` 命令执行。

处理静态列表

假设有以下颜色列表: `rainbowColorList = Violet, Indigo, Blue, Green, Yellow, Orange, Red`。

我们可以使用 Bash `for` 循环,将上述字符串列表逐行打印出来,具体如下:

#!/bin/sh

# 定义列表
rainbowColorList=Violet,Indigo,Blue,Green,Yellow,Orange,Red

# 使用 //,/ 将逗号分隔的列表转换为空格分隔的列表
for colors in ${rainbowColorList//,/ }
do
  echo $colors
done

执行结果将会把列表中的每一项打印在新的一行。

# 输出结果
Violet
Indigo
Blue
Green
Yellow
Orange
Red

读取数组

声明数组的语法与列表略有不同。 每个元素(字符串)都使用括号括起来。

rainbowArray=("Violet" "Indigo" "Blue" "Green" "Yellow" "Orange" "Red")

for colors in "${rainbowArray[@]}"; do
    echo "我喜欢 $colors"
done

符号 `[@]` 用于访问数组中的每一个元素。

# 输出结果

我喜欢 Violet
我喜欢 Indigo
我喜欢 Blue
我喜欢 Green
我喜欢 Yellow
我喜欢 Orange
我喜欢 Red

我们还可以使用 `for` 循环同时打印数组的索引和元素。

# 打印索引和元素

rainbowArray=("Violet" "Indigo" "Blue" "Green" "Yellow" "Orange" "Red")

for i in "${!rainbowArray[@]}";
do
  echo "索引为 " $i " 的颜色是: " "${rainbowArray[$i]}"
  i=$((i+1));
done
# 输出结果

索引为 0 的颜色是: Violet
索引为 1 的颜色是: Indigo
索引为 2 的颜色是: Blue
索引为 3 的颜色是: Green
索引为 4 的颜色是: Yellow
索引为 5 的颜色是: Orange
索引为 6 的颜色是: Red

注意,我们使用 `!` 符号来获取元素的索引。

数字范围的迭代

我们可以使用 Bash 的 `for` 循环来迭代一系列数字。

# 迭代数字范围

echo "倒计时开始..."

for N in {10..0}
do
    echo "$N"
done

符号 `..` 表示一个数字范围。

# 输出结果
10
9
8
7
6
5
4
3
2
1
0

我们还可以通过指定步长来跳过计数。

在下面的例子中,我们以步长 3 进行倒数:

# 跳过计数迭代

echo "倒计时开始..."

for N in {30..0..3}
do
    echo "$N"
done

上面的程序从数字 30 开始倒数到 0。`for` 循环中最后一个参数 `3` 指定跳过的步长。

# 输出结果
30
27
24
21
18
15
12
9
6
3
0

字符串和字符

Bash 的 `for` 循环可以用来进行各种有趣的字符串操作。

例如,我们可以使用 `seq` 操作符,在 `for` 循环中读取字符串的每个字符:

# 读取字符串的每个字符

myword="welcome"

for i in $(seq 1 ${#myword})
do
  echo "${myword:i-1:1}"
done

请注意,`seq` 从 1 开始,以便首先获取第一个字符。

# 输出结果
w
e
l
c
o
m
e

我们还可以逐个打印由空格分隔的字符串:

# 读取句子中的每个单词

mysentence="Welcome to techblik.com. One stop hub for all techies"

for word in $mysentence; do
    echo $word
done
# 输出结果
Welcome
to
techblik.com.
One
stop
hub
for
all
techies

表达式

与其他编程语言(如 Java)类似,我们可以在 Bash `for` 循环中使用表达式。

for (( var=10; var>=0; var-- ))
do
   echo "倒计时...$var"
done
# 输出结果
倒计时...10
倒计时...9
倒计时...8
倒计时...7
倒计时...6
倒计时...5
倒计时...4
倒计时...3
倒计时...2
倒计时...1
倒计时...0

读取命令行参数

为了读取命令行参数,我们使用 `read` 命令。 在下面的示例中,我们将从用户那里获取一些数字,并使用 Bash `for` 循环计算它们的总和。 我们使用 `total` 变量来存储中间和最终的总和。

read -a array -p "请输入您要相加的数字:"

total=0

for i in ${array[@]}; do
  let total+=$i
done

echo "这些数字的和是: $total"

输出结果如下:

# 输出结果

请输入您要相加的数字: 3 4 66
这些数字的和是: 73

查找奇数和偶数

为了查找 1 到 10(或任何数字 N)之间的奇数和偶数,我们需要使用 `if` 条件和 Bash `for` 循环。 判断一个数字是否为偶数,我们需要将该数字除以 2,如果余数为 0,则将其归类为偶数,否则将其归类为奇数。

# 声明用于存放奇数和偶数的列表

evennum=""
oddnum=""

for (( i=1; i<=10; i++ ))
do
  remainder=$(( $i % 2 ))
  if [ $remainder -eq 0 ]; then
    evennum="$evennum $i "
  else
    oddnum="$oddnum $i "
  fi
done

echo "偶数有: "$evennum
echo "奇数有: "$oddnum

在上面的示例中,我们将范围指定为 10。 您可以修改此数字以获得任意范围内的奇数和偶数。 此外,您可以尝试使用上一节学到的 `read` 命令从用户那里获取数字。

# 输出结果
偶数有: 2 4 6 8 10
奇数有: 1 3 5 7 9

无限循环

无限循环是不会停止执行的循环,你需要使用 Ctrl+C 强制程序停止。 我们可以使用 `; ;` 运算符轻松创建无限循环。

for (( ; ; ))
do
  echo "欢迎来到 techblik.com"
done
# 输出结果

欢迎来到 techblik.com
欢迎来到 techblik.com
欢迎来到 techblik.com
欢迎来到 techblik.com
欢迎来到 techblik.com
欢迎来到 techblik.com
欢迎来到 techblik.com
欢迎来到 techblik.com
欢迎来到 techblik.com
欢迎来到 techblik.com
^C
$

中断语句

Break 语句用于在满足 `if` 条件时退出循环。

for color in Violet Indigo Blue Green Yellow Orange Red
do
  if [[ "$color" == 'Green' ]]; then
    break
  fi
  echo "正在寻找绿色,当前的颜色是 $color"
done

echo "找到了我的颜色 $color"

在这个例子中,我们尝试找到绿色。 `For` 循环遍历每种颜色,一旦找到绿色,程序就会因为 `break` 语句退出循环。

# 输出结果
正在寻找绿色,当前的颜色是 Violet
正在寻找绿色,当前的颜色是 Indigo
正在寻找绿色,当前的颜色是 Blue
找到了我的颜色 Green

继续语句

`continue` 用于跳过当前循环迭代,并根据条件跳转到下一个迭代。 例如,如果你不想打印之前程序中的“绿色”,可以使用 `continue` 语句,这样将会显示除绿色外的所有其他颜色。

for color in Violet Indigo Blue Green Yellow Orange Red
do
  if [[ "$color" == 'Green' ]]; then
    continue
  fi
  echo "$color"
done
# 输出结果
Violet
Indigo
Blue
Yellow
Orange
Red

总结

本文涵盖了 Bash `for` 循环的最常见用法,包括字符串、整数、数组和列表。 如果你正在学习 Linux,但在 Windows 10 机器上操作,你可以使用 WSL 功能并在你的 Windows 机器上安装 Linux。

然后,你可以像使用 CMD 一样使用 Linux 终端。

接下来,你还可以了解如何使用 Python 运行 Bash 脚本。