bash脚本中的循环功能

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

输入接口电路开关及波形抖动汇总
基于JK触发器的十二归一计数器的设计仿真
苹果加紧研发M3芯片,或将在明年发布高端笔记本
识别色环电阻阻值的方法
小米“失去”一员大将 全球副总裁雨果·巴拉宣布离职
bash脚本中的循环功能
求一种极海APM32F035工业排气扇应用方案
中国电信宣布在上海已实现千兆光网全面覆盖
ST推出新款业界独有的照明控制器芯片STLUX385
蓝牙耳机的无线频率
DAC如何实现宽带平滑阻抗变换电路的设计
简单介绍基于ZigBee自组网模块的路灯控制网络
韦尔半导体最新推出了三款5G射频开关器件
空气污染可能会引发的疾病有哪些,你需要知道
2019年第三季度可穿戴设备出货量8450万台,同比增长94.6%
照明电路常见故障_照明电路故障排除方法
链改以后将会是区块链广泛的认知吗
如何快速实现具有专用高音单元和低音单元的高质量 TWS 耳塞设计
基于fpga的图像处理
威迈斯:已向Stellantis集团量产销售车载电源集成产品