循环结构,特别是 `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 脚本。