循环是 bash 脚本中一个很重要的功能,用途广泛。本篇文章我们介绍三种不同的循环,然后利用循环遍历数组。
for 循环
for 循环有两种不同的写法:
c 语言样式的 for 循环
如果你熟悉 c 或者 c++等编程语言,那么对于如下循环应该不会陌生:
for ((initialize ; condition ; increment)); do
[COMMANDS]
done
根据上述语法,我们写一个例子,打印 Hello Friend 十次:
for ((i = 0 ; i < 10 ; i++)); do
echo "Hello Friend"
done
上述代码中,首先将整型变量 i 初始化为 0,然后设置循环条件(i<10),如果条件为真,则执行循环,打印 Hello Friend,并将变量 i 递增 1,然后进行下一次循环,知道 i<10不再满足。
$ bash hello.sh
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend
列表中使用的 for 循环
列表循环是 for 循环的一种变体,这在处理列表或者数组的时候特别方便,其语法如下:
for item in [LIST]; do
[COMMANDS]
done
比如,我们重写一下上面的那个例子:
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
/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
while 循环
while 循环是 bash 中另一个应用很广泛的循环,其语法如下:
while [ condition ]; do
[COMMANDS]
done
作为演示,我创建一个名为 3x10.sh 的脚本,用于打印前10个3的倍数:
#!/bin/bash
num=1
while [ $num -le 10 ]; do
echo $(($num * 3))
num=$(($num+1))
done
其执行结果如下:
$ ./3x10.sh
3
6
9
12
15
18
21
24
27
30
上述脚本中,首先将变量 num 初始化为 1,然后设定循环条件为 num 小于或等于 10。在循环体中,打印 num 乘以 3,然后将 num 递增 1。
until 循环
如果你有 c/c++ 编程背景,那你可能会不自觉的找 do-while 循环。但是,在 bash 中并不存在 do-while 循环。
bush 中存在另一种循环,即 until 循环,其与 while 循环具有相同的语法:
until [ condition ]; do
[COMMANDS]
Done
until 循环与 while 循环之间的主要区别在于循环条件。当循环条件为真时,while 循环会继续,但是,当循环条件为假时,until 循环才会继续。
比如上面我们写的 3x10.sh 脚本,我们使用 until 循环来实现,如下:
#!/bin/bash
num=1
until [ $num -gt 10 ]; do
echo $(($num * 3))
num=$(($num+1))
done
大家应该可以注意到,上面的循环条件为 $num -gt 10,为前一个例子中 -le 的否定。
循环的具体应用
上面我们介绍了 bash 中循环的用法,下面在实际例子中介绍一下循环的使用。
打印数组的内容
在此之前,我们假定大家了解 bash 中的数组。
遍历数组,for 循环通常是最首要的选择。
如下脚本 prime.sh 中,将会遍历并打印出数组中的所有元素:
#!/bin/bash
prime=(2 3 5 7 11 13 17 19 23 29)
for i in "${prime[@]}"; do
echo $i
done
执行一下,结果如下:
$ ./prime.sh
2
3
5
7
11
13
17
19
23
29
在循环中使用 break 和 continue
有时候我们可能希望提前退出循环,或者跳过本次循环。那么此时需要分别使用 break 和 continue。
break 将会终止循环,并将程序控制转到循环后的下一个命令或指令。
比如,下面的循环只会打印从 1 到 3:
for ((i=1;i<=10;i++)); do
echo $i
if [ $i -eq 3 ]; then
break
fi
done
使用 continue 语句会跳过本次循环,继续执行下次循环。比如,下面脚本 odd.sh 只会打印从 1 到 10 之间的奇数,而跳过偶数:
#!/bin/bash
for ((i=0;i<=10;i++)); do
if [ $(($i % 2)) -ne 1 ]; then
continue
fi
echo $i
done
执行结果如下:
$ ./odd.sh
1
3
5
7
9
无限循环
无限循环是一个永远运行的循环,其循环条件始终为真。大多数情况下,无限循环是因为逻辑错误造成的bug。
例如,有人可能希望创建一个循环,以降序打印数字1到10,结果可能会错误地创建以下无限循环:
for ((i=10;i>0;i++)); do
echo $i
done
上述错误是将 i 递增 1。要修复这个问题需要将递增改为递减 i--:
for ((i=10;i>0;i--)); do
echo $i
done
在某些情况下,我们可能希望有意创建无限循环,以等待系统满足外部条件。如下所示:
for ((;;)); do
[COMMANDS]
done
如果想要创建一个无限 while 循环,可参考如下:
while [ true ]; do
[COMMANDS]
done
全部0条评论
快来发表一下你的评论吧 !