[9-13]Shell系列3——分支结构

发布时间:2019-06-30 16:51:51编辑:auto阅读(1909)

    本文旨在复习shell实现分支结构的3种if语句和case多分支结构语句,以及补充if和case的执行效率

    知识储备


    • Shell脚本中语言结构还是那3种:顺序结构、选择结构、循环结构

    • 分支结构选择结构是同一概念,依据一定的条件选择执行路径,而不是严格按照语句出现的物理顺序

    • If语句和Case语句是在shell中实现分支结构的具体表现形式,同C语言中的if和switch语句

    • 下面的语句我以结构流程图、代码实现[代码格式]、具体例子来阐述


    IF单分支结构


    流程图

    wKioL1X_uuLwyqasAALMPJ7eTwo772.bmp

    代码实现

    1
    2
    3
    4
    5


    if [ expression ];then
        statement1
        statement2
        ......
    fi

    具体例子:如果当前年份是2015就显示"你要好好学习了!"

    请注意[ expression ]表达式前后有空格!否则语法错误

    1
    2
    3
    4
    5


    #!/bin/bash

    if [ $(date +%Y) -eq 2015 ];then
            echo 
    "You should study hard!"
    fi

    wKiom1X_vNbA4GCTAAQUgCxN1fY292.bmp


    IF双分支结构


    流程图

    wKiom1X_vr-zWjjcAAUPqK9EKM4986.bmp

    代码实现    

    1
    2
    3
    4
    5
    6
    7


    if [ expreesion ];then
        statment1
        ......
    else
        statement2
        ......
    fi

    具体例子:读取用户输入的两个数,比较输出大数

    1
    2
    3
    4
    5
    6
    7
    8


    #!/bin/bash

    read -p "Enter 2 Number: " a b
    if [ $a -ge $b ];then
        echo 
    "$a"
    else
        echo 
    "$b"
    fi

    wKioL1X_wjjiM9X3AAN6OHVfAVU933.bmp


    IF多分支结构


    流程图

    wKioL1X_xZnRwFs0AAvFgMqXFhw221.bmp

    代码实现

    1
    2
    3
    4
    5
    6
    7
    8
    9


    if   [ expression1 ];then
        statement1
    elif [ expression2 ];then
        statement2
    elif [ expression3 ];then
        statement3
    else
        statment4
    fi

    具体例子:输入考试分数,90分[含]以上为A等,80-90为B等,60-80为C等,60以下为D等

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12


    #!/bin/bash

    read -p "Enter your Score: " score
    if [ $score -ge 90 ];then
        echo 
    "Grade A"
    elif [ $score -ge 80 ];then 
        echo 
    "Grade B"
    elif [ $score -ge 60 ];then
        echo 
    "Grade C"
    else 
        echo 
    "Grade D"
    fi

    wKiom1X_xZjiBEs_AAVlqGYaVq8250.bmp


    IF注意点

    判断条件可以使用[ expression ]` expression `两种,效果通常一致但有特殊情况,` `是关键字,对于字符串判断更好,建议都使用` `这种

    ` `中的判断条件可以使用逻辑运算将多个expression组合起来,比如

    1
    2
    3
    4
    5
    6
    7
    8
    9


    #当且仅当满足exp1和exp2时候才会执行command1
    if [ expression1 -a expression2 ];then
        command1
    fi

    #常用的逻辑运算符
        -a 逻辑与
        -o 逻辑或
        -! 非

    上面介绍了If语句实现分支的3种结构,If语句有2种写法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10


    #形式一
    if [ expression ];then
        command1
    fi

    #形式二
    if [ expression ]
    then
        command1
    fi


    Case多分支结构


    流程图

    wKioL1X_z7ejtd7nAAvRfGuWdVs731.bmp

    代码实现   

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14


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

    具体例子:用户输入数字1-3中的一个,若存在则返回该数字,否则报错   

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17


    #!/bin/bash

    read -p "Enter a Number 1-3: " num
    case $num 
    in
    1)
        echo 
    "1"
        ;;
    2)
        echo 
    "2"
        ;;
    3
        echo 
    "3"
        ;;
    *)
        echo 
    "Please Be sure the number from 1-3"
        ;;
    esac

    wKioL1X_0Yey7LieAAWbWDwTxcg068.bmp


    Case注意点

    每一个case分支,即模式N中包含的若干指令,最后一定要以" ;; "标识该模式匹配执行结束

    以case始,以esac终。 ---> 正好单词的倒写


    If和Case的执行效率


    处理Case分支时:计算机会生成跳转表,根据变量的取值跳转到合适的分支,执行完毕 Over

    处理If分支的时:跳转次数不定的,是按照顺序结构一条一条判定来跳转的,比如输入成绩显示Grade那个例子而言,如果输入是95那么不用跳转1次搞定,如果是45分则需要多次跳转

    总结:

        <1>分支较多时,选用case...esac结构会提高程序的效率,但不足在于只能处理字符或者数字类型的变量,

        <2>if...else结构更灵活,if...else结构可以用于判断表达式是否成立,比如if(a+b>c),if...else的应用范围更广。

关键字