Bash 循环
循环是编程语言的基本概念之一。当你想反复运行一系列的命令,直到达到某个条件时,循环就很方便。
在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
为真,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
break
和continue
声明
break
和continue
语句可以用来控制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
循环用于重复执行一组给定的命令,执行的次数是固定的。
如果你有任何问题或反馈意见,请随时留言。