想象一下,您有一个充满数千个文件的目录,并且要求您一一处理这些文件。听起来好像很麻烦,对吧?在 Bash 脚本中使用 For 循环时,情况并非如此。 bash 脚本中的 for 循环是一个神奇的工具,它允许您自动执行重复性任务,同时高效地处理文件,而无需费力。在本文中,我们将解释 bash 中的 for 循环是什么,并提供一些实际示例以轻松实现自动化。 
Bash 脚本中的 For 循环是什么
For 循环是一种控制结构,用于执行重复任务或执行一系列命令特定次数。 for 循环允许您迭代数字、列表、文件甚至目录。 
Bash For 循环:POSIX 风格的语法
POSIX(可移植操作系统接口)样式语法在 bash 等 POSIX 兼容 shell 中可用,可用于迭代文件列表、任意序列或其他命令的输出。 bash 脚本的 for 循环语法是:
for <loop_variable> in <list_to_iterate>
do
<Commands_to_be_executed_in_each_iteration>
done
上述语法的含义如下:
- <loop_variable>是一个用户定义的变量,用于保存 <list_to_iterate> 中的每一项。
- <list_to_iterate>指向 for 循环应迭代的项目列表。它可以是数字、字符串、命令输出等的列表。
- do 关键字指示 for 循环的开始。
- <Commands_to_be_execulated_in_each_iteration>包含要在每次迭代中执行的命令或语句。
- Done 关键字标记 for 循环的结束。
现在让我们看一些基于 POSIX 风格的 for 循环的实际示例。

示例 1:在指定范围内循环
#!/bin/bash
# Print numbers from 1 to 5
for i in $(seq 1 5); do
echo $i
done在上面的代码片段中,$(seq 1 5)部分用于生成从1到5的整数列表。然后它逐个循环列表,将每个值打印在新行上。
示例 2:循环数组
#!/bin/bash
fruits=("Apple" "Banana" "Orange" "Grapes")
for fruit in "${fruits[@]}"; do
echo "Fruit: $fruit"
done数组是一种数据结构,用于包含多个不同类型的数据。在上面的片段中:
- 这条线
fruits=("Apple" "Banana" "Orange" "Grapes")用于声明一个包含四个不同水果名称的数组。 - 这行“
for fruit in "${fruits[@]}"; do” 设置一个 For 循环。指定变量“fruit”来保存当前元素的值,并将“${fruits[@]}指定为要迭代的数组。 “${fruits[@]}”中的“@”代表数组的所有元素。 - 行
echo "Fruit: $fruit"在每次迭代期间在新行上打印每个水果的名称以及单词“Fruit”。 - 最后,最后一行“done”标志着 for 循环的结束。
从上述命令得到的输出是:
示例 3:带命令替换的循环
#!/bin/bash
for file in $(ls); do
echo "File: $file"
done命令替换的工作方式是首先执行命令,然后 for 循环迭代命令的输出。重复的命令放在“ $() ”内。在上面的片段中:
-
for file in $(ls); dofor file in $(ls); do$(ls)然后,该部分运行“ls”命令,其输出(当前目录中的文件列表)用作循环的输入。该循环遍历输出中找到的每个文件名。 -
echo "File: $file"行在每次迭代期间打印带有前缀“File:”的“file”变量的值。 “file”变量包含循环中正在处理的当前文件的名称。 - 最后,最后一行“done”标志着 for 循环的结束。
使用上例中所示的命令替换的 for 循环的输出将是:

Bash For 循环:C 风格语法
C 风格语法适合熟悉 C、C++、Java 和 JavaScript 等其他语言的 for 循环语法的用户。 C 风格的 for 循环的基本语法是:
for ((<variable_initialization>; <test_condition>; <step_value>))
do
<commands_to_execute>
done上面的语法看起来像这样:
-
<variable_initialization>指循环变量开始的初始值。 -
<test_condition>定义输出所依赖的条件。每次迭代都会检查此条件。 -
<step_value>指向循环变量应更新的值。 - <commands_to_execute> 指的是每次迭代时需要执行的命令或语句。
现在让我们看一些基于 C 风格 for 循环的实际示例。
示例 1:打印 1 到 10 的奇数
!#/bin/bash
for((i = 1; i <= 10; i = i + 1))
do
if (( i % 2 == 1 ))
then
echo "Odd Number: $i"
fi
done在上面的片段中:
-
for((i = 1; i <= 10; i = i + 1))行将循环变量初始化为 1,在每次迭代中检查 i 的值是否小于或等于 10,最后递增循环多变的。通过在每次迭代时将当前值加 1 来计算 i 的值。 - if (( i % 2 == 1 )) 检查 i 的当前值除以 2 是否等于 1 –
- 如果它可被整除,则执行 echo “Odd Number: $i” 行并打印 i 的值。
- fi 行标记 if 条件的结束。
- 最后,最后一行标志着 for 循环的结束并最后执行。
我用上面的代码得到的输出是:
示例 2:循环数组
#!/bin/bash
fruits=("Apple" "Banana" "Orange" "Grapes")
for ((i = 0; i < ${#fruits[@]}; i++)); do
echo "Fruit $((i+1)): ${fruits[i]}"
done上面的代码看起来像这样:
- Fruits=(“Apple”“Banana”“Orange”“Grapes”) 创建所有水果名称的数组。
- for ((i = 0; i < ${#fruits[@]}; i++)) 首先将循环变量’i’初始化为0,它也充当数组的索引变量,循环返回’i’小于“fruits”数组中的元素数量(由 ${#fruits[@]} 表示)。循环在每次迭代时将“i”增加 1。
- 数组索引从 0 开始,但我希望它从 1 开始显示,因此 echo “Fruit $((i+1)): ${fruits[i]}” 行打印一个等于当前索引的值。 “i”加 1。
- 最后,最后一行标志着 for 循环的结束。
上面for循环的输出是:




![2021 年如何设置 Raspberry Pi Web 服务器 [指南]](https://i0.wp.com/pcmanabu.com/wp-content/uploads/2019/10/web-server-02-309x198.png?w=1200&resize=1200,0&ssl=1)

