Bash中的循环
循环的能力是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