循环

    Bash中有四种循环:forwhileuntilselect

    for与它在C语言中的姊妹非常像。看起来是这样:

    在每次循环的过程中,arg依次被赋值为从elem1elemN。这些值还可以是通配符或者。

    当然,我们还可以把for循环写在一行,但这要求do之前要有一个分号,就像下面这样:

    1. for i in {1..5}; do echo $i; done

    还有,如果你觉得for..in..do对你来说有点奇怪,那么你也可以像C语言那样使用for,比如:

    1. for (( i = 0; i < 10; i++ )); do
    2. echo $i
    3. done

    while循环检测一个条件,只要这个条件为 ,就执行一段命令。被检测的条件跟if..then中使用的基元并无二异。因此一个while循环看起来会是这样:

    1. do
    2. # 语句
    3. done

    for循环一样,如果我们把do和被检测的条件写到一行,那么必须要在do之前加一个分号。

    比如下面这个例子:

    1. # 0到9之间每个数的平方
    2. x=0
    3. while [[ $x -lt 10 ]]; do # x小于10
    4. echo $(( x * x ))
    5. x=$(( x + 1 )) # x加1
    6. done

    until循环跟while循环正好相反。它跟while一样也需要检测一个测试条件,但不同的是,只要该条件为 就一直执行循环:

    select循环帮助我们组织一个用户菜单。它的语法几乎跟for循环一致:

    1. select answer in elem1 elem2 ... elemN
    2. do
    3. # 语句
    4. done

    一个可能的实例可能会是这样:

    1. #!/bin/bash
    2. select ITEM in bower npm gem pip
    3. do
    4. echo -n "Enter the package name: " && read PACKAGE
    5. case $ITEM in
    6. bower) bower install $PACKAGE ;;
    7. npm) npm install $PACKAGE ;;
    8. gem) gem install $PACKAGE ;;
    9. pip) pip install $PACKAGE ;;
    10. esac
    11. break # 避免无限循环
    12. done

    这个例子,先询问用户他想使用什么包管理器。接着,又询问了想安装什么包,最后执行安装操作。

    运行这个脚本,会得到如下输出:

    我们会遇到想提前结束一个循环或跳过某次循环执行的情况。这些可以使用shell内建的breakcontinue语句来实现。它们可以在任何循环中使用。

    break语句用来提前结束当前循环。我们之前已经见过它了。

    1. for (( i = 0; i < 10; i++ )); do
    2. if [[ $(( i % 2 )) -eq 0 ]]; then continue; fi

    运行上面的例子,会打印出所有0到9之间的奇数。