在Bash中能否中断for循环?附嵌套循环场景咨询
在Bash中中断for循环的方法
当然可以!在Bash里完全能灵活控制for循环的执行流程,针对你这种嵌套循环的场景,我给你拆解下常用的控制方式,再结合你的代码示例调整:
核心控制命令
continue:跳过当前循环的剩余代码,直接进入下一次迭代break:终止当前所在的循环;如果是嵌套循环,还可以通过加数字参数终止多层循环(比如break 2会直接跳出两层循环)
结合你的代码示例修改
假设你的需求是:一旦找到不符合迁移条件的磁盘组合,就停止对应层级的检查,我把你的代码调整成带循环控制的版本:
#!/bin/bash # 假设m和n是已定义的数组长度,sourcedisktype、targetdisktype是已初始化的数组 for (( i = 0 ; i <= m-1 ; i++)); do for (( j = 0 ; j <= n-1 ; j++)); do # 用&&替代-a,可读性更好 if [ "${sourcedisktype[i]}" == "SSD" ] && [ "${targetdisktype[j]}" == "BSAS" ]; then echo "volume cannot be moved1" break 2 # 直接跳出两层循环,终止所有检查 elif [ "${sourcedisktype[i]}" == "SSD" ] && [ "${targetdisktype[j]}" == "SAS" ]; then echo "volume cannot be moved2" break # 只跳出内层循环,继续检查下一个源磁盘 elif [ "${sourcedisktype[i]}" == "SAS" ] && [ "${targetdisktype[j]}" == "BSAS" ]; then echo "volume cannot be moved3" continue # 跳过当前目标磁盘的后续检查,直接试下一个目标磁盘 fi # 如果没有触发上面的条件,执行这里的正常迁移逻辑 echo "Checking disk pair $i-$j: eligible for move" done done
细节说明
break 2的用法:当你需要一旦发现不符合条件的组合就彻底停止所有遍历,用这个命令直接跳出外层和内层循环- 单独
break:只终止当前的内层循环,外层循环会继续遍历下一个源磁盘 continue:跳过当前内层循环中continue之后的代码,直接进入下一个目标磁盘的检查- 替换
-a为&&:[ ... -a ... ]是test命令的旧写法,用两个独立的[ ]加&&逻辑与,兼容性和可读性都更好
内容的提问来源于stack exchange,提问作者Prarthana
相关产品推荐
相关产品推荐

