Bash for详解

for循环是编程语言中的基础概念之一。当你想要重复执行一系列命令,直到满足特定条件时,它们就非常有用。在Bash脚本中,有三种基本的循环结构:for循环、while循环和until循环。

for循环

在像Bash这样的脚本语言中,循环对于自动化重复性任务非常有用,消除了重复编写相同代码的需要。

Bash for

一、标准的Bash for循环

for循环遍历一个项目列表并执行给定的命令集。

Bash for循环采用以下形式:

for item in [列表]
do
  [命令]
done

列表可以是一系列由空格分隔的字符串、数字范围、命令的输出、数组、从命令行传递的参数等。

二、循环遍历字符串

下面的例子展示了一个循环,它遍历一个字符串列表。循环对列表中的每个项目进行操作,变量element存储循环当前正在操作的项目。

for element in Hydrogen Helium Lithium Beryllium
do
  echo "元素:$element"
done

循环将产生以下输出:

元素:Hydrogen
元素:Helium
元素:Lithium
元素:Beryllium

三、循环遍历范围

您可以使用序列表达式通过定义范围的起始点和结束点来指定数字或字符的范围。序列表达式采用以下形式:

这里是一个示例循环,它遍历从0到3的所有数字:

for i in {0..3}
do
  echo "数字:$i"
done
数字:0
数字:1
数字:2
数字:3

从Bash 4开始,使用范围时还可以指定增量。表达式采用以下形式:

这里是一个示例,展示了如何以5为增量:

for i in {0..20..5}
do
  echo "数字:$i"
done
数字:0
数字:5
数字:10
数字:15
数字:20

四、循环遍历数组元素

您也可以使用for循环来遍历数组中的元素。

在下面的示例中,我们定义了一个名为BOOKS的数组,并遍历数组的每个元素。

BOOKS=('追寻逝去的时光' '堂吉诃德' '尤利西斯' '了不起的盖茨比')

for book in "${BOOKS[@]}"
do
  echo "书籍:$book"
done
书籍:追寻逝去的时光
书籍:堂吉诃德
书籍:尤利西斯
书籍:了不起的盖茨比

四、C风格的Bash for循环

C风格的for循环的语法采用以下形式:

for ((初始化;测试;步进))
do
  [命令]
done

初始化部分仅在循环开始时执行一次。然后,评估测试部分。如果为假,则终止循环。如果测试为真,则执行for循环体内的命令,并更新步进部分。

在以下示例代码中,循环首先通过初始化i = 0开始,在每次迭代之前检查i ≤ 10。如果为真,则打印当前的i值,并增加变量i的值1(i++)。否则,循环终止。

for ((i = 0 ; i <= 1000 ; i++)); do
  echo "计数器:$i"
done

循环将迭代1001次,并产生以下输出:

计数器:0
计数器:1
计数器:2
...
计数器:998
计数器:999
计数器:1000

五、 嵌套循环

嵌套循环是另一个循环内的循环。您可以嵌套任何循环任何次数。

在嵌套的for循环中,内部循环为每个外部循环迭代运行一个完整的迭代周期。这意味着对于外部循环的每次执行,内部循环将执行其所有迭代,直到外部循环完成其周期。

以下是一个示例代码,将三个文件逐个复制到三台服务器。

for f in file_{1..3}; do
  for j in server_{1..3}; do
    echo "正在将文件 $f 复制到服务器 $j";
    # 复制文件的命令
  done;
done
正在将文件 file_1 复制到服务器 server_1
正在将文件 file_1 复制到服务器 server_2
正在将文件 file_1 复制到服务器 server_3
正在将文件 file_2 复制到服务器 server_1
正在将文件 file_2 复制到服务器 server_2
正在将文件 file_2 复制到服务器 server_3
正在将文件 file_3 复制到服务器 server_1
正在将文件 file_3 复制到服务器 server_2
正在将文件 file_3 复制到服务器 server_3

六、 breakcontinue语句

breakcontinue语句可用于控制for循环的执行。

break语句

break语句终止当前循环,并将程序控制权传递给终止语句之后的语句。它通常用于在满足特定条件时终止循环。

在以下示例中,我们使用if语句在当前迭代项目等于‘Lithium’时终止循环的执行。

for element in Hydrogen Helium Lithium Beryllium; do
  if [[ "$element" == 'Lithium' ]]; then
    break
  fi
  echo "元素:$element"
done

echo '全部完成!'
元素:Hydrogen
元素:Helium
全部完成!

continue语句

continue语句退出循环的当前迭代,并将程序控制权传递给循环的下一个迭代。

在以下示例中,我们正在遍历一系列数字。当当前迭代项目等于‘2’时,continue语句将导致执行返回到循环的开头,并继续下一个迭代:

for i in {1..5}; do
  if [[ "$i" == '2' ]]; then
    continue
  fi
  echo "数字:$i"
done
数字:1
数字:3
数字:4
数字:5

七、 Bash for示例

重命名文件名中带有空格的文件

以下示例展示了如何通过将空格替换为下划线来重命名当前目录中所有文件名中带有空格的文件:

for file in * *; do
  mv "$file" "${file// /_}"
done

让我们逐行分解代码:

  • 第一行创建了一个for循环,并遍历了当前目录中所有文件名中带有空格的文件列表。表达式* *创建了列表。
  • 第二行适用于列表中的每个项目,并将文件移动到一个新的位置,用下划线(_)替换空格。${file// /_}部分使用了shell参数扩展来替换参数中的模式为字符串。
  • done表示循环段的结束。

更改文件扩展名

以下示例展示了如何使用Bash for循环将当前目录中所有以.jpeg结尾的文件的文件扩展名从.jpeg更改为.jpg。

for file in *.jpeg; do
    mv -- "$file" "${file%.jpeg}.jpg"
done

让我们逐行分析代码:

  • 第一行创建了一个for循环,并遍历了所有以‘.jpeg’结尾的文件列表。
  • 第二行适用于列表中的每个项目,并将文件移动到一个新的位置,将‘.jpeg’替换为‘.jpg’。${file%.jpeg}使用shell参数扩展从文件名中移除‘.jpeg’部分。
  • done表示循环段的结束。

Bash for循环用于重复执行一组给定的命令固定次数。

Bash Case详解
zshrc文件详解

发表我的评论

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

87 + 66 =

ajax-loader