Bash 循环

评论 0 浏览 0 2018-11-10

循环是编程语言的基本概念之一。当你想反复运行一系列的命令,直到达到某个条件时,循环就很方便。

在Bash等脚本语言中,循环对于重复性任务的自动化是很有用的。

在Bash脚本中,有三种基本的循环结构,for循环,while循环,以及until循环

在本教程中,我们将介绍Bash中for循环的基础知识。我们还将告诉你如何使用breakcontinue语句来改变循环的流程。

标准的Bash for 循环

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

Bash for 循环的形式如下。

for item in [LIST]
do
  [COMMANDS]
done

列表可以是一系列用空格隔开的字符串,一个数字范围,一个命令的输出,一个数组,等等。

在字符串上进行循环

在下面的例子中,该循环将遍历字符串列表中的每一项,变量element将被设置为当前的项目。

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

该循环将产生以下输出。

输出

Element: Hydrogen
Element: Helium
Element: Lithium
Element: Beryllium

在一个数字范围内循环播放

你可以使用序列表达式来指定一个数字或字符的范围,通过定义范围的起点和终点。序列表达式的形式如下。

{START..END}

下面是一个循环的例子,它遍历了从0到3的所有数字。

for i in {0..3}
do
  echo "Number: $i"
done

输出

Number: 0
Number: 1
Number: 2
Number: 3

从Bash 4开始,在使用范围时也可以指定一个增量。该表达式的形式如下。

{START..END..INCREMENT}

下面是一个例子,显示了如何以5为单位递增。

for i in {0..20..5}
do
  echo "Number: $i"
done

输出

Number: 0
Number: 5
Number: 10
Number: 15
Number: 20

在数组元素上进行循环

你也可以使用for 循环来迭代一个数组的元素。

在下面的例子中,我们定义了一个名为BOOKS的数组,并对该数组中的每个元素进行了迭代。

BOOKS=('In Search of Lost Time' 'Don Quixote' 'Ulysses' 'The Great Gatsby')

for book in "${BOOKS[@]}"; do
  echo "Book: $book"
done

输出

Book: In Search of Lost Time
Book: Don Quixote
Book: Ulysses
Book: The Great Gatsby

C风格的Bash for 循环

C风格的for循环的语法采取了以下形式。

for ((INITIALIZATION; TEST; STEP))
do
  [COMMANDS]
done

当循环开始时,INITIALIZATION部分只被执行一次。然后,TEST部分被评估。如果它是假的,循环被终止。如果TEST为真,for循环体内的命令被执行,STEP部分被更新。

在下面的示例代码中,循环的开始是初始化i = 0,在每次迭代之前检查i ≤ 10。如果是真的,它就会打印 i的当前值,并[将变量]i增加1(i++),否则循环就会终止。

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

该循环将迭代1001次,并产生以下输出结果。

输出

Counter: 0
Counter: 1
Counter: 2
...
Counter: 998
Counter: 999
Counter: 1000

breakcontinue声明

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

break 陈述

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

在下面的例子中,我们使用if语句来终止循环的执行,一旦当前的迭代项等于'Lithium',就终止执行。

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

echo 'All Done!'

输出

Element: Hydrogen
Element: Helium
All Done!

continue 陈述

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

在下面的例子中,我们在一个数字范围内进行迭代。当当前迭代的项目等于'2'时,continue语句将使执行返回到循环的开始,并继续下一次迭代。

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

输出

Number: 1
Number: 3
Number: 4
Number: 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'结尾的文件的列表。
  • 第二行适用于列表中的每一项,并将文件移动到一个新文件中,用“.jpg”替换“.jpeg”。 ${file%.jpeg} 使用 shell 参数扩展
  • done表示循环段的结束。

总结

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

如果你有任何问题或反馈意见,请随时留言。

最后更新2023-06-28
0 个评论
标签