Bash中的循环

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

循环的能力是Bash脚本的一个非常强大的功能。

在本教程中,我们将探索三种不同的BASH循环结构。
我们还将学习如何使用循环到遍历数组元素。

bash for循环

for循环,是我们可以在BASH中使用的三种不同类型的循环结构之一。
有两种不同的样式 编写for循环。

  • C风格循环
  • 在列表/范围内使用for循环

Bash中 c语言类型for循环

如果我们熟悉C或者C++,如编程语言,那么我们将识别以下for循环语法:

for ((initialize ; condition ; increment)); do
[COMMANDS]
done

使用上述C样式语法,以下循环将打印出"Hello Friend"十次:

for ((i = 0 ; i < 10 ; i++)); do
	echo "Hello Friend"
done

for循环首先初始化整数变量I为零,然后测试条件(i <10);如果为true,则循环执行线路回声"hello friend"并将变量I递增1,然后循环再次运行,直到我不再小于10.

Hyman@theitroad:~$bash hello.sh 
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend

BASH中列表/范围的for循环

对于循环的另一个语法变化也存在,如果我们使用文件(或者字符串)列表,数字范围,阵列,命令的输出等,则特别有用。
循环的列表/范围语法采用以下形式:

for item in [LIST]; do
[COMMANDS]
done

例如,以下用于循环与我们在上一节中创建的循环的C样式完全相同:

for i in {1..10}; do
	echo "Hello Friend"
done

下面的var.sh脚本将输出/var目录下存在的所有文件和目录:

#!/bin/bash
for i in /var/*; do
	echo $i 
done

下面是运行var.sh脚本时的示例输出:

Hyman@theitroad:~$./var.sh
/var/backups
/var/cache
/var/crash
/var/lib
/var/local
/var/lock
/var/log
/var/mail
/var/metrics
/var/opt
/var/run
/var/snap
/var/spool
/var/tmp

bash中while循环

while循环是另一个我们可以在Bash脚本中使用的直观的循环。
while循环的一般语法如下:

while [ condition ]; do
[COMMANDS]
done

例如,以下3x10.sh脚本使用一小时的循环,该循环将打印第三个的前十个倍数:

#!/bin/bash
num=1
while [ $num -le 10 ]; do
	echo $(($num * 3))
	num=$(($num+1))
done

这是上面脚本的输出:

Hyman@theitroad:~$./3x10.sh
3
6
9
12
15
18
21
24
27
30

它首先将num变量初始化为1;然后,只要num小于或者等于10,循环将运行。
在循环的主体内,RUN的回声命令打印乘以三个,然后它递增1.

Bash中的Until循环

如果我们来自C/C++背景,我们可能正在寻找一个小时的循环,但Bash中不存在。

Bash中存在另一种循环。
Until循环遵循与while循环相同的语法:

until [ condition ]; do
[COMMANDS]
Done

直到循环和循环的关键区别在于测试条件。
只要测试条件为真,一段时间就会继续运行;在翻盖方面,只要测试条件为假,直到循环就会继续运行!

例如,我们可以轻松地使用直到循环而不是循环创建3x10.sh脚本;这里的诀窍是否定测试条件:

#!/bin/bash
num=1
until [ $num -gt 10 ]; do
	echo $(($num * 3))
	num=$(($num+1))
done

请注意,否定测试条件[$num -le 10];是[$num -gt 10];

打印BASH中数组的内容

使用for循环迭代数组元素,通常这是最受欢迎的方法。

例如,以下Prime.sh脚本迭代并在Prime数组中打印出每个元素:

#!/bin/bash
prime=(2 3 5 7 11 13 17 19 23 29)
for i in "${prime[@]}"; do
	echo $i
done

这是Prime.sh脚本的输出:

Hyman@theitroad:~$./prime.sh
2
3
5
7
11
13
17
19
23
29

在Bash 循环中使用Break 和 Continue 语句

有时我们可能希望过早退出循环或者跳过循环迭代。
为此,我们可以使用中断Break 和 继续Continue语句。

Break语句终止执行循环并将程序控件转换为循环后的下一个命令或者指令。

例如,以下循环仅将数字从一到三个打印:

for ((i=1;i<=10;i++)); do
	echo $i
	if [ $i -eq 3 ]; then
		break
	fi
done

我们还可以使用Continue语句来跳过循环迭代。
循环继续并移动到下一次迭代,但在继续迭代中跳过继续语句后的命令。

例如,以下Odd.sh脚本只会将奇数从一到十打印,因为它会跳过所有偶数:

#!/bin/bash
for ((i=0;i<=10;i++)); do
	if [ $(($i % 2)) -ne 1 ]; then
		continue
	fi
	echo $i
done

这是打印奇数的输出:

Hyman@theitroad:~$./odd.sh
1
3
5
7
9

bash中的死循环

无限循环是一圈,不断运行;当循环测试条件始终为真时,会发生这种情况。

在大多数情况下,无限循环是人为逻辑错误的产物。

例如,可能希望在降序中创建一个循环的人以降序打印1到10的循环可能最终错误地创建以下无限循环:

for ((i=10;i>0;i++)); do
	echo $i
done

问题是,循环一直在将变量递增1.
要修复它,我们需要使用i-ups更改i ++,如下所示:

for ((i=10;i>0;i--)); do
	echo $i
done

在某些情况下,我们可能希望有意创建无限循环以等待系统上要满足的外部条件。
我们可以轻松地为循环创建无限循环:

for ((;;)); do
	[COMMANDS]
done

如果要在循环时创建无限,则可以创建如下:

while [ true ]; do
	[COMMANDS]
done