zoukankan      html  css  js  c++  java
  • for what? while 与 until 差在哪?-- Shell十三问<第十三问>

    for what? while 与 until 差在哪?-- Shell十三问<第十三问>

    最后要介绍的是 shell script 设计中常见的"循环"(loop)。
    所谓的 loop 就是 script 中的一段在一定条件下反复执行的代码。

    bash shell 中常用的 loop 有如下三种:

    • for
    • while
    • until

    for loop 是从一个清单列表中读进变量值,并"依次"的循环执行 do 到 done 之间的命令行。

    例:

    for var in one two three four five
    do
    		echo -----------
    		echo '$var is '$var
    		echo
    done
    

    上例的执行结果将会是:

    1. for 会定义一个叫 var 的变量,其值依次是 one two three four five 。
    2. 因为有 5 个变量值,因此 do 与 done 之间的命令行会被循环执行 5 次。
    3. 每次循环均用 echo 产生三行句子。而第二行中不在 hard quote 之内的 $var 会依次被替换为 one two three four five 。
    4. 当最后一个变量值处理完毕,循环结束。我们不难看出,在 for loop 中,变量值的多寡,决定循环的次数。然而,变量在循环中是否使用则不一定,得视设计需求而定。倘若 for loop 没有使用 in 这个 keyword 来指定变量值清单的话,其值将从 $@ (或 $* )中继承:
    for var; do
    ....
    done
    (若你忘记了 positional parameter ,请温习第 9 章...)
    

    for loop 用于处理"清单"(list)项目非常方便,其清单除了可明确指定或从 positional parameter 取得之外,也可从变量替换或命令替换取得... (再一次提醒:别忘了命令行的"重组"特性!)

    然而,对于一些"累计变化"的项目(如整数加减),for 亦能处理:

    for ((i=1;i<=10;i++))
    do
    		echo "num is $i"
    done
    

    除了 for loop ,上面的例子我们也可改用 while loop 来做到:

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

    while loop 的原理与 for loop 稍有不同:
    它不是逐次处理清单中的变量值,而是取决于 while 后面的命令行之 return value :

    1. 若为 ture ,则执行 do 与 done 之间的命令,然后重新判断 while 后的 return
      value 。
    2. 若为 false ,则不再执行 do 与 done 之间的命令而结束循环。
      分析上例:
      1. 在 while 之前,定义变量 num=1 。
      2. 然后测试(test) $num 是否小于或等于 10 。
      3. 结果为 true ,于是执行 echo 并将 num 的值加一。
      4. 再作第二轮测试,其时 num 的值为 1+1=2 ,依然小于或等于 10,因此为 true ,继续循环。
      5. 直到 num 为 10+1=11 时,测试才会失败... 于是结束循环。
    3. 我们不难发现:若 while 的测试结果永远为 true 的话,那循环将一直永久执行下去:
    while :; do
    		echo looping...
    done
    

    上例的" : "是 bash 的 null command ,不做任何动作,除了送回 true 的 return value 。
    因此这个循环不会结束,称作死循环。死循环的产生有可能是故意设计的(如跑 daemon),也可能是设计错误。若要结束死循环,可透过 signal 来终止(如按下 ctrl-c )。

    一旦你能够理解 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
    

    在结束本章之前,再跟大家补充两个与 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 ,也就是继续当前的循环。

    在 shell script 设计中,若能善用 loop ,将能大幅度提高 script 在复杂条件下的处理能力。

  • 相关阅读:
    SAP MM 采购附加费计入物料成本之二
    SAP MM 采购附加费计入物料成本?
    SAP MM 作为采购附加费的运费为啥没能在收货的时候计入物料成本?
    SAP MM 外部采购流程里的Advanced Return Management
    SAP MM 外部采购流程里的如同鸡肋一样的Advanced Returns Management功能
    SAP MM Why is the freight not included in the material cost at the time of GR?
    SAP MM: Change of material moving average price after goods receipt and invoice verification posting for PO
    SAP 创建启用了ARM功能的采购订单,报错 Shipping processing is not selected to supplier 100057 in purchase org. 0002
    GIT·代码仓库默认分支更改
    .Net/C#·运行报错缺少XXX文件,但双击无法跳转缺少位置
  • 原文地址:https://www.cnblogs.com/passzhang/p/12201485.html
Copyright © 2011-2022 走看看