bash for 循环

时间:2020-03-05 15:31:36  来源:igfitidea点击:

循环是编程语言的基本概念之一。
当我们要一遍又一遍地运行一系列命令直到达到特定条件时,循环很方便。

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

Bash脚本中有三种基本的循环构造,即'for'循环,'while'循环和'until'循环。

在本教程中,我们将介绍Bash中for循环的基础。
我们还将向我们展示如何使用“ break”和“ continue”语句来改变循环流。

标准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”为true,则将执行“ for”循环体内的命令,并更新“ STEP”部分。

在下面的示例代码中,循环通过初始化'i = 0'来开始运行,并在每次迭代之前检查'i≤10'。
如果为true,则打印当前值'i'并将[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

“break”和“continue”语句

'break'和'continue'语句可用于控制for循环的执行。

“break”语句

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

在以下示例中,一旦当前迭代项等于“锂”,我们将使用“ if”语句终止循环的执行。

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替换为.jpg来重命名当前目录中所有以.jpeg结尾的文件。

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

让我们逐行分析代码:

  • 第一行创建一个“ for”循环,并循环访问以“ .jpeg”结尾的所有文件的列表。
  • 第二行适用于列表的每个项目,并将文件移至新文件,将“ .jpeg”替换为“ .jpg”。 '${file%.jpeg}',使用shell参数扩展从文件名中删除“ .jpeg”部分
  • “ done”表示循环段的结尾。