shell的流程控制介绍

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell的流程控制介绍相关的知识,希望对你有一定的参考价值。

Lnux shell和Java、php等语言不一样,它有一套自己的流程控制语句,其中包括条件语句(if,case),循环语句(for,while,until),循环控制语句(continue,break,shift)。下面我会通过一些简单明了的例子来介绍下各个语句的使用方法。

一、条件语句

    1if语句

1)单分支结构

if 判断条件; then

               条件为真的分支代码

fi

    示例:testif1.sh   

    #!/bin/bash
    a=5
    if [[ a -gt 4 ]] ;then 
        echo ‘ok‘
    fi

    

2)双分支结构

if 判断条件; then

                条件为真的分支代码

else

                条件为假的分支代码

fi

示例:testif2.sh

    #!/bin/bash
    scores=40
    if [[ $scores -gt 60 ]];then   
         echo "pass"
    else    
         echo "no pass"
    fi

    这里有个要特别注意的一点,就是结尾的fi是if倒过来拼写,和接下来要介绍的case同样的用法,case的结尾esac也是case倒过来的拼写,千万不要写错了,小编在第一次写脚本的时候就没注意到这一点,就总是出错,仔细一检查脚本原来是结尾符号写反了,真的很尴尬呀!技术分享然后我就发现了一个减少错误的方法:就是在写条件语句或是循环语句时,首先把语句的格式给写完,然后再向里边添加要实现的语句,这样就不会忘了写结尾或是写反了。其实这也只是我个人的习惯。

3)多分支结构

if 判断条件1; then

 条件为真的分支代码

elif 判断条件2; then

          条件为真的分支代码

elif 判断条件3; then

          条件为真的分支代码

else

          以上条件都为假的分支代码

fi

示例:testif3.sh

    #!/bin/bash
    scores=40
    if [[ $scores -gt 90 ]];then    
        echo "very good!"
    elif [[ $scores -gt 80 ]]; then    
        echo "good!"
    elif [[ $scores -gt 60 ]]; then    
        echo "pass!"
    else    
        echo "no pass!"
    fi

    2case语句

case 变量引用 in

PAT1)

            分支1;;

PAT2)

            分支2;;

            ......

*)

            默认分支;;

esac


 case支持glob风格的通配符:         

           *: 任意长度任意字符                      

            ?: 任意单个字符               

            []:指定范围内的任意单个字符 

            a|b: ab                                                   


       示例:testcase.sh   

    #/bin/bash
    echo "
    本店菜品:
        1.羊肉汤
        2.辣子鸡丁米饭
        3.胡辣汤
        4.饺子
        5.拉面
        6.烩面
    read -p "请输入序号查看价格: " num
    case $num in
    1|4)
        echo "20¥"
        ;;
    3|6)
        echo "10¥"
        ;;
    2|5)
        echo "12¥"
        ;;
    *)
        echo "输入错误"
        ;;
    esac
    unset num

二、循环语句

    1for循环

for 变量名 in 列表;do

循环体

done

for ((控制变量初始化;条件判断表达式;控制变量的修正表达式));do

循环体

done

   注意:列表的方式可为:{1..n}、`seq 1 $n` 、/root/bin/*.sh

for循环的执行机制:

依次将列表中的元素赋值给“变量名”; 每次赋值后即执行一次循环体; 直到列表中的元素耗尽,循环结束。

示例:testfor1.sh

    #!/bin/bash
    for i in $(seq 10); do #或 for i in `seq 1  10`; do  
        echo $i
    done

说明:seq字符串只要用空格字符分割,每次for…in 读取时候,就会按顺序将读到值,给前面的变量。

示例:testfor2.sh,这种格式类似于c语言格式,学过编程的应该都能看懂的。技术分享

    #!/bin/bash
    for((i=1;i<=10;i++));do    
        echo $i
    done

    2、while循环

while循环用于不断执行一系列命令,也用于从输入文件中读取数据;命令通常为测试条件。其格式为:

while CONDITION; do

循环体

done

CONDITION:循环控制条件;进入循环之前,先做一次判断;每一次循环之后会再次做判断;条件为“true”,则执行一次循环;直到条件测试状态为“false”终止循环。因此:CONDTION一般应该有循环控制变量;而此变量的值会在循环体不断地被修正。

进入条件:CONDITION为true

退出条件CONDITION为false

示例:testwhile1.sh

    #!/bin/bash
    i=10;
    while [[ $i -gt 5 ]];do
        echo $i
        let i--
    done

    运行结果:==============================

     testwhile1.sh
       10
        9
        8
        7
        6

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

   示例:testwhile2.sh(循环读取文件中的内容) 

    #!/bin/bash
    while read line;do   
         echo $line
    done < /etc/passwd

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

    示例:testwhile3.sh     

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

         运行结果:==============================           

     [[email protected] shell]#bash whileread1.sh 

     按下 <CTRL-D> 退出

     输入你最喜欢的网站名: 菜鸟教程

     是的!菜鸟教程 是一个好网站

    while无限循环: 

    while true(:); do
        循环体
    done

     3、until循环

until CONDITION; do

循环体

done

意思是:直到满足条件,就退出。否则执行循环体的内容。

进入条件:CONDITION为false

退出条件CONDITION为true

until语句的执行正好和while相反,其实在平常写脚本时,小编还是比较喜欢用while,感觉用着特别顺手。

示例:testuntil.sh

    #!/bin/bash
    a=10
    until [[ $a -lt 0 ]];do
        echo $a
        let a--
    done

      until无限循环:

    until false; do
        循环体
    done


三、循环控制语句

        在循环过程中,有时候需要在未达到循环结束条件时强制跳出循环,Shell使用两个命令来实现该功能:continuebreak

     1、continue,主要用于循环体中

continue [N]:提前结束第N层的本轮循环,而直接进入下一轮判断;最内层为1层。

continue 不会跳出所有循环,仅仅跳出当前循环。

while CONDTIITON1; do

CMD1

...

if CONDITION2; then

continue

fi

CMDn

...

done

 示例:testcontinue.sh

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

      运行结果:===================================

    [[email protected] bin]#testcontinue.sh 

    输入 1 到 5 之间的数字: 2

    你输入的数字为 2!

    输入 1 到 5 之间的数字: 7

    你输入的数字不是 1 到 5 之间的!

    输入 1 到 5 之间的数字: 3

    你输入的数字为 3!

      2、break

break [N]:提前结束第N层循环,最内层为第1层。

break命令允许跳出所有循环,下面的例子中,脚本进入死循环直至用户输入数字大于5。要跳出这个循环,返回到shell提示符下,需要使用break命令。

while CONDTIITON1; do

CMD1

...

if CONDITION2; then

break

fi

CMDn

...

done

 示例:testbreak.sh

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

    运行结果:====================================      

    [[email protected] bin]#testbreak.sh 

    输入 1 到 5 之间的数字:2

    你输入的数字为 2!

    输入 1 到 5 之间的数字:7

    你输入的数字不是 1 到 5 之间的! 游戏结束

    结合上边两个例子,我们可以看出:在continue循环中,如果输入的不是1~5之间的数字,就会继续运行脚本重新输入,而不是退出脚本,相当于进入了死循环,因此,echo "游戏结束"这行代码永远就不会被执行;而在break循环中,如果输入的不是1~5之间的数字,就会跳出循环,退出脚本。

      3shift

用于将量列表list 左移指定次数,缺省为左移一次。v

参量列表list 一旦被移动,最左端的那个参数就从列表中删除。while 循环遍历位置参量列表时,常用到shift

    示例:./doit.sh a b c d e f g h

    #!/bin/bash
    while [ $# -gt 0 ] # or (( $# > 0 ));do
        echo $*
        shift
    done

      ./shfit.sh a b c d e f g h

    #!/bin/bash
    until [ -z "$1" ] ;do
        echo "$1"
    shift
    done
    echo

    

    最后还有一个不太常用的工具:select

 select 循环主要用于创建菜单,按数字顺序排列的菜单项将显示在标准错误上,并显示PS3 提示符,等待用户输入。用户输入被保存在内置变量 REPLY 中。

select 是个无限循环,因此要记住用break 命令退出循环,或用exit 命令终止脚本。也可以按ctrl+c 退出循环。格式如下: 

select variable in list

do

循环体命令

done

    示例:testselect.sh 

    #/bin/bash
    PS3="请选择菜单:"
    select menu in 羊肉汤 辣子鸡丁 米饭 胡辣汤 饺子 拉面 烩面;do
    case $REPLY in
    1|4)
        echo "20¥"
        ;;
    3|6)
        echo "10¥"
        ;;
    2|5)
        echo "12¥"
        ;;
    7)
        break
        ;;
    *)
        echo "输入错误"
        ;;
    esac

    



 

 


以上是关于shell的流程控制介绍的主要内容,如果未能解决你的问题,请参考以下文章

linux shell 流程控制

Shell流程控制

linux shell 流程控制

Shell编程

Linux Shell——流程控制

shell脚本流程控制