如何实现Bash for循环在条件不满足时停留在当前迭代
问题分析
bash里用for i in {1..10}这种迭代列表的循环时,循环变量i是预先从展开的列表中依次取值,手动修改i的值不会影响下一次迭代的取值——哪怕你写((i--)),下一次循环还是会取列表里的下一个元素,这就是你代码失效的原因。
解决方案
改用while循环控制i的递增逻辑,同时在每次迭代里加一个内部循环,专门等待jobstatus变为true,具体代码如下:
i=1 # 外层循环控制i从1到10的范围 while [ $i -le 10 ]; do # 内部循环:持续读取输入,直到jobstatus为true while true; do read jobstatus if [ "$jobstatus" = "true" ]; then echo 'Okay lets progress' break # 满足条件,退出内部循环,处理当前i else echo 'Nop, cant progress' fi done # 输出当前迭代的i值 echo $i # i递增,准备下一次外层循环 ((i++)) done
逻辑说明
- 外层
while循环负责控制i的范围(1到10),只有当i超过10时才会终止整个循环。 - 每次进入外层循环后,先进入内部的无限循环:不断读取
jobstatus输入,直到输入true才跳出内部循环。 - 跳出内部循环后,输出当前的
i值,然后让i自增,进入下一轮外层循环。
这样就能实现你要的效果:比如当i=5时输入false,会一直停在内部循环等待,直到输入true,才会输出5,然后i变为6继续后续迭代。
内容的提问来源于stack exchange,提问作者LambTheBamb
相关产品推荐
相关产品推荐

