Linux-scripts-选择结构

9.Scripts

本章同步视频:https://edu.51cto.com/sd/e4874

9.4 选择结构

9.4.1 利用 if .... then

1.单分支选择结构

(1)格式1

if  condition

then

    statement(s)

fi

condition是判断条件,如果 condition 成立(返回“真”),那么 then 后边的语句将会被执行;如果 condition 不成立(返回“假”),那么不会执行任何语句。

注意,最后必须以fi来闭合,fi 就是 if 倒过来拼写。也正是有了 fi 来结尾,所以即使有多条语句也不需要用{ }包围起来。

[root@localhost tmp]# vim 1.sh

#!/bin/bash

if test -e /root

then

        echo "/root is here!"

fi

[root@localhost tmp]# sh 1.sh

/root is here!

(2)格式2

if  condition;  then

    statement(s)

fi

注意 condition 后边的分号;,当 if 和 then 位于同一行的时候,这个分号是必须的,否则会有语法错误。

[root@localhost tmp]# vim 1.sh

#!/bin/bash

if test -e /root ;then

        echo "/root is here!"

fi

[root@localhost tmp]# sh 1.sh

/root is here!

(3)实例

[root@localhost tmp]# vim 1.sh

#!/bin/bash

read -p "Please input (Y/N): " yn

if [ "${yn}" == "Y" ] || [ "${yn}" == "y" ]; then

echo "OK, continue"

exit 0

fi

if [ "${yn}" == "N" ] || [ "${yn}" == "n" ]; then

echo "Oh, interrupt!"

exit 0

fi

echo "I don't know what your choice is" && exit 0

[root@localhost tmp]# sh 1.sh

Please input (Y/N): n       #输入n

Oh, interrupt!

[root@localhost tmp]# sh 1.sh

Please input (Y/N): y       #输入y

OK, continue

[root@localhost tmp]# sh 1.sh

Please input (Y/N): c       #输入c

I don't know what your choice is

2.双分支选择结构

(1)格式

if  condition

then

   statement1

else

   statement2

fi

if  condition ;then

   statement1

else

   statement2

fi

如果 condition 成立,那么 then 后边的 statement1 语句将会被执行;否则,执行 else 后边的 statement2 语句。

(2)案例

[root@localhost tmp]# vim 1.sh

#!/bin/bash

read -p "input a:" a

read -p "input b:" b

if (( $a == $b ))          #算术运算用(())

then

    echo "a和b相等"

else

    echo "a和b不相等,输入错误"

fi

[root@localhost tmp]# sh 1.sh

input a:3

input b:5

a和b不相等,输入错误

[root@localhost tmp]# sh 1.sh

input a:3

input b:3

a和b相等

3.多分支选择结构

(1)格式

if  condition1  ;then

   statement1

elif condition2  ;then

    statement2

elif condition3  ;then

    statement3

……

else

   statementn

fi

注意,if 和 elif 后边都得跟着 then。

整条语句的执行逻辑为:

如果 condition1 成立,那么就执行 if 后边的 statement1;如果 condition1 不成立,那么继续执行 elif,判断 condition2。

如果 condition2 成立,那么就执行 statement2;如果 condition2 不成立,那么继续执行后边的 elif,判断 condition3。

如果 condition3 成立,那么就执行 statement3;如果 condition3 不成立,那么继续执行后边的 elif。

如果所有的 if 和 elif 判断都不成立,就进入最后的 else,执行 statementn。

(2)案例1

[root@localhost tmp]# vim 1.sh

#!/bin/bash

if [ "${1}" == "hello" ]; then

echo "Hello, how are you ?"

elif [ "${1}" == "" ]; then

echo "You MUST input parameters, ex> {${0} someword}"

else

echo "The only parameter is 'hello', ex> {${0} hello}"

fi

[root@localhost tmp]# sh 1.sh

You MUST input parameters, ex> {1.sh someword}

[root@localhost tmp]# sh 1.sh nihao

The only parameter is 'hello', ex> {1.sh hello}

[root@localhost tmp]# sh 1.sh hello

Hello, how are you ?

(3)案例2

#!/bin/bash

printf "Input integer number: "

read num

if test $num -eq 1 ; then      #第一种条件写法

    echo "Monday"

elif [ $num -eq 2 ] ; then      #第二种条件写法

    echo "Tuesday"

elif [[ $num -eq 3 ]]; then     #第三种条件写法

    echo "Wednesday"

elif ((num==4)); then           #第四种条件写法

    echo "Thursday"

elif ((num==5)); then           #第四种仅限数值用法

    echo "Friday"

elif ((num==6)); then

    echo "Saturday"

elif ((num==7)); then

    echo "Sunday"

else

    echo "error"

fi

9.4.2   利用 case ..... esac 判断

1.格式

case expression in

    pattern1)

        statement1

        ;;

    pattern2)

        statement2

        ;;

    pattern3)

        statement3

        ;;

    ……

    *)

        statementn

esac

2.说明:

u  case、in 和 esac 都是 Shell 关键字,expression 表示表达式,pattern 表示匹配模式。

u  expression 既可以是一个变量、一个数字、一个字符串,还可以是一个数学计算表达式,或者是命令的执行结果,只要能够得到 expression 的值就可以。

u  pattern 可以是一个数字、一个字符串,甚至是一个简单的正则表达式。

u   可以没有*)部分。如果 expression 没有匹配到任何一个模式,那么就不执行任何操作。

u  除最后一个分支外(这个分支可以是普通分支,也可以是*)分支),其它的每个分支都必须以;;结尾,;;代表一个分支的结束。最后一个分支可以写;;,也可以不写。

u  如果不加以说明,Shell 的值都是字符串,expression 和 pattern 也是按照字符串的方式来匹配的。

3.执行过程

       case 会将 expression  的值与 pattern1、pattern2、pattern3 逐个进行匹配:

如果 expression 和某个模式(比如 pattern2)匹配成功,就会执行这模式(比如 pattern2)后面对应的所有语句(该语句可以有一条,也可以有多条),直到遇见双分号;;才停止;然后整个 case 语句就执行完了,程序会跳出整个 case 语句,执行 esac 后面的其它语句。

       如果 expression 没有匹配到任何一个模式,那么就执行*)后面的语句(*表示其它所有值),直到遇见双分号;;或者esac才结束。*)相当于多个 if 分支语句中最后的 else 部分。

4.case in 支持正则表达式

格式

说明

*

表示任意字符串。

[abc]

表示   a、b、c 三个字符中的任意一个。比如,[15ZH] 表示 1、5、Z、H 四个字符中的任意一个。

[m-n]

表示从 m 到 n 的任意一个字符。比如,[0-9]   表示任意一个数字,[0-9a-zA-Z] 表示字母或数字。

|

表示多重选择,类似逻辑运算中的或运算。比如,abc | xyz 表示匹配字符串 "abc" 或者 "xyz"。

5.案例1

#!/bin/bash

printf "Input integer number: "

read num

case $num in

    1)

        echo "Monday"

        ;;

    2)

        echo "Tuesday"

        ;;

    3)

        echo "Wednesday"

        ;;

    4)

        echo "Thursday"

        ;;

    5)

        echo "Friday"

        ;;

    6)

        echo "Saturday"

        ;;

    7)

        echo "Sunday"

        ;;

    *)

        echo "error"

esac

6.案例2

#!/bin/bash

printf "Input a character: "

read -n 1 char

case $char in

    [a-zA-Z])

        printf "\nletter\n"

        ;;

    [0-9])

        printf "\nDigit\n"

        ;;

   [,.?!])

        printf "\nPunctuation\n"

        ;;

    *)

        printf "\nerror\n"

esac


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章