5 个有用的 Bash For 循环示例
想象一下,您有一个充满数千个文件的目录,并且您被要求一一处理这些文件。听起来很乏味,对吧?如果您在 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); do
,$(ls)
然后,part 执行“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]}” 打印等于当前索引的值 “我”加 1。
- 最后,最后一行表示for循环结束
这是上面 for 循环的输出: