until循环和while循环整体概念是一样的,只不过while循环的循环前提是满足while判断时进入子模块中,当不满足while判断条件时跳出循环,如果while判断条件一直满足就一直进行循环;until循环的循环前提是不满足until判断时进入子模块中,当满足until判断条件时跳出循环,如果until判断条件一直不满足就一直进行循环。
- until 判断条件 #判断进入和退出循环的条件语句,不满足该条件时进入下面的子代码中,执行完子代码后再进行until条件判断,直到满足until的条件语句,不走子代码模块,直接结束循环。
- do #语法格式
- 子代码模块 #子代码模块,不满足until条件后,就进入到子代码模块中
- done
为了容易看出区别,这里直接和while循环用一样的例子。
- #!/bin/bash
-
- i=0 #给i赋值为0
- until (($i>2)) #开始进行判断 i(i=0) > 2,进入循环中
- do #语法格式
- let "i++" #这行代码就是让i进行累加,第一次i为0,i+1=1然后得到结果为1 再赋值给i 此时i就=1了,现在再跳出循环,去进行until的循环判断 (具体代码流转见下方)
- done #语法格式
- echo $i #输出i的值
执行结果截图:
首先i=0,然后until判断0>2不成立,然后进入到until的子代码中,进行i++的计算,刚刚第一遍循环结束后,i的值现在为1,此时去进行until循环的判断,发现i(i=1)>2不满足循环条件,然后再进入到循环中,去进行i++(就是i = i + 1)的赋值,此时得到结果为2,然后去进行until循环条件的判断,发现i(i=2) < 2仍不满足until的判断条件,这时候再进入到子代码中进行i++计算,此时i=3,然后再去进行until的判断,发现i(i=3)>2满足until的判断条件了,这时候就不执行子代码了。直接打印i的值出来,输出的结果为:i=3
这里再把流程简单的描述下
第一次循环:i=0 until的判断条件为i>2,不满足条件,进行子代码操作i++,此时i=1
第二次循环:i=1 until的判断条件为i>2,不满足条件,进行子代码操作i++,此时i=2
第三次循环:i=2 until的判断条件为i>2,不满足条件,进行子代码操作i++,此时i=3
第四次循环:i=3 until的判断条件为i>2,满足条件了,就不进行子代码操作,循环结束,打印结果为i=3
总结下就是,只要不满足until循环的条件,就会去until的子代码中进行一遍操作,最后出来的值,再去进行until的循环判断,如果还不满足就继续执行,直到最后出来的值满足until的循环
所有的循环语句必须考虑循环控制的问题,如果循环条件能一直不满足,就会跳不出循环一直执行下去,程序将进入无限循环状态或发生内存溢出的问题。此时可以用ctrl+C强制结束。
如果上面能理解的话,这时候我们把echo $i写到循环里,看看最后的输出结果是什么?
- #!/bin/bash
-
- i=0 #给i赋值为0
- until (($i>2)) #开始进行判断 不满足i(i=0) > 2时,进入循环中
- do #语法格式
- let "i++" #这行代码就是让i进行累加,第一次i为0,i+1=1然后得到结果为1 再赋值给i 此时i就=1了,现在再跳出循环,去进行until的循环判断 (具体代码流转见下方)
- echo $i #输出i的值
- done #语法格式
执行结果截图:
这个为啥会有两个结果呢?因为echo在until的循环条件中,每次+1后都会打印一次值出来
第一次循环:i=0 until的判断条件为i>2,不满足条件,进行子代码操作i++,此时i=1,然后打印结果 1
第二次循环:i=1 until的判断条件为i>2,不满足条件,进行子代码操作i++,此时i=2 然后打印结果 2
第二次循环:i=2 until的判断条件为i>2,不满足条件,进行子代码操作i++,此时i=3 然后打印结果 2
第三次循环:i=3 until的判断条件为i>2,满足条件,不进行子代码操作,循环结束,因为已经走不到循环操作里了,所以就不会再去打印了
这篇结合着上篇while对比着看就能看出差异了,根据不同场合选择不同的循环方式即可。
只看判断条件即可:
while是满足时进入到子代码模块中,不满足时结束循环;
until是不满足时进入到子代码模块中,满足时结束循环。