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
使用 bash 脚本打印从 1 到 5 的所有整数

在上面的代码片段中, $(seq 1 5) 部分用于生成从 1 到 5 的整数列表。然后它将逐个循环该列表,然后每个值将打印在新行上。

打印 1 到 5 之间的整数

示例 2:循环数组

#!/bin/bash

fruits=("Apple" "Banana" "Orange" "Grapes")

for fruit in "${fruits[@]}"; do
    echo "Fruit: $fruit"
done
bash 脚本使用 for 循环打印数组中的水果名称

数组是一种数据结构,用于包含多个不同类型的数据。在上面的代码片段中:

  • 线路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 脚本打印所有文件名

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
在bash中使用ac风格的for循环语法打印从1到10的奇数

在上面的代码片段中:

  • 该行将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 循环的结束并在最后执行。

以下是上述代码的输出:

printing odd numbers from 1 to 10

示例 2:循环数组

#!/bin/bash

fruits=("Apple" "Banana" "Orange" "Grapes")
for ((i = 0; i < ${#fruits[@]}; i++)); do
    echo "Fruit $((i+1)): ${fruits[i]}"
done
bash script with for loop to print all elements in an array

在上面的代码中:

  • 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 循环的输出:

printing the values in an array

类似文章

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注