Linux shell编程中IO和条件及循环处理的细节问题讨论

2019-09-23 09:20:25于丽

我们不难发现:若while的测试结果永远为true的话,那循环将一直永久执行下去:

while : ;do
  echo looping…
done

上例的:是bash的null command,不做任何动作,除了送回true的return value。因此这个循环不会结束,称作死循环。死循环的产生有可能是故意设计的(如跑daemon),也可能是设计错误。若要结束死循环,可透过signal来终止(如按下ctrl-c)。(关于process与signal,等日后有机会再补充,十三问暂时略过。)

一旦你能够理解while loop的话,那,就能理解until loop:

与while相反,until是在return value为false时进入循环,否则结束。
因此,前面的例子我们也可以轻松的用until来写:

num=1
until [ ! "$num" -le 10 ]; do
  echo "num is $num"
  num=$(($num + 1))
done

或是:

num=1
until [ "$num" -gt 10 ]; do
  echo "num is $num"
  num=$(($num + 1))
done

okay,关于bash的三个常用的loop暂时介绍到这里。在结束本章之前,再跟大家补充两个与loop有关的命令:break continue

这两个命令常用在复合式循环里,也就是在do…done之间又有更进一层的loop,当然,用在单一循环中也未尝不可啦…^_^

break是用来打断循环,也就是“强迫结束”循环。若break后面指定一个数值n的话,则“从里向外”打断第n个循环,预设值为break 1,也就是打断当前的循环。
在使用break时需要注意的是,它与return及exit是不同的:

break是结束loop return是结束function exit是结束script/shell

而continue则与break相反:强迫进入下一次循环动作。若你理解不来的话,那你可简单的看成:在continue到done之间的句子略过而返回循环顶端…与break相同的是:continue后面也可指定一个数值n,以决定继续哪一层(从里向外计算)的循环,预设值为continue 1,也就是继续当前的循环。