美文网首页
学习Shell - 流程控制

学习Shell - 流程控制

作者: wenjieli | 来源:发表于2017-10-16 16:40 被阅读0次

    和其他语言不一样, shell的流程控制不可为空.

    if

    if condition
    then
    command1
    command2
    ...
    commandN
    fi
    

    写成一行命令, 需要加;
    if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi

    if else

    if condition
    then
        command1 
        command2
        ...
        commandN
    else
        command
    fi
    

    if else-if else

    if condition1
    then
        command1
    elif condition2 
    then 
        command2
    else
        commandN
    fi
    

    实例

    a=10
    b=20
    if [ $a == $b ]
    then
       echo "a 等于 b"
    elif [ $a -gt $b ]
    then
       echo "a 大于 b"
    elif [ $a -lt $b ]
    then
       echo "a 小于 b"
    else
       echo "没有符合的条件"
    fi
    

    if else语句经常与test命令结合使用,如下所示:

    num1=$[2*3]
    num2=$[1+5]
    if test $[num1] -eq $[num2]
    then
        echo '两个数字相等!'
    else
        echo '两个数字不相等!'
    fi
    

    for循环

    for var in item1 item2 ... itemN
    do
        command1
        command2
        ...
        commandN
    done
    

    实例

    for loop in 1 2 3 4 5
    do
        echo "The value is: $loop"
    done
    
    for str in 'This is a string'
    do
        echo $str
    done
    

    结果为: This is a string

    while 语句

    while condition
    do
        command
    done
    

    实例

    int=1
    while(( $int<=5 ))
    do
        echo $int
        let "int++"
    done
    

    使用中使用了 Bash let 命令,它用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量

    echo '按下 <CTRL-D> 退出'
    echo -n '输入你最喜欢的网站名: '
    while read FILM
    do
        echo "是的!$FILM 是一个好网站"
    done
    

    while循环可用于读取键盘信息。下面的例子中,输入信息被设置为变量FILM,按<Ctrl-D>结束循环。

    无限循环

    方式一
    while :
    do
        command
    done
    方式二
    while true
    do
        command
    done
    方式三
    for (( ; ; ))
    

    until循环

    类似 其他语言的do..while语句, 先执行, 后判断, 知道条件为真, 跳出循环

    until condition
    do
        command
    done
    

    case

    case 值 in
    模式1)
        command1
        command2
        ...
        commandN
        ;;
    模式2)
        command1
        command2
        ...
        commandN
        ;;
    esac
    

    case工作方式如上所示。取值后面必须为单词in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;。
    取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。
    实例

    echo '输入 1 到 4 之间的数字:'
    echo '你输入的数字为:'
    read aNum
    case $aNum in
        1)  echo '你选择了 1'
        ;;
        2)  echo '你选择了 2'
        ;;
        3)  echo '你选择了 3'
        ;;
        4)  echo '你选择了 4'
        ;;
        *)  echo '你没有输入 1 到 4 之间的数字'
        ;;
    esac
    

    break

    跳出所有循环, 终止执行后面的所有循环

    while :
    do
        echo -n "输入 1 到 5 之间的数字:"
        read aNum
        case $aNum in
            1|2|3|4|5) echo "你输入的数字为 $aNum!"
            ;;
            *) echo "你输入的数字不是 1 到 5 之间的! 游戏结束"
                break
            ;;
        esac
    done
    

    continue

    continue命令与break命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环。

    while :
    do
        echo -n "输入 1 到 5 之间的数字: "
        read aNum
        case $aNum in
            1|2|3|4|5) echo "你输入的数字为 $aNum!"
            ;;
            *) echo "你输入的数字不是 1 到 5 之间的!"
                continue
                echo "游戏结束" #永远不会执行
            ;;
        esac
    done
    

    esac

    case的语法和C family语言差别很大,它需要一个esac(就是case反过来)作为结束标记,每个case分支用右圆括号,用两个分号表示break。

    相关文章

      网友评论

          本文标题:学习Shell - 流程控制

          本文链接:https://www.haomeiwen.com/subject/lwfkuxtx.html