Linux集群和自动化维2.3 Shell中的控制流结构

    xiaoxiao2024-03-12  120

    2.3 Shell中的控制流结构

    Shell中的控制流结构也比较清晰,如下所示:

    if ...then... else...fi语句

    case语句

    for循环

    until循环

    while循环

    break控制

    continue控制

    工作中用得最多的就是if语句、for循环、while循环及case语句,大家可以以这几个为重点对象来学习。

    if语句语法如下:

    if 条件1

    then

      命令1

    else

      命令2

    fi

    if语句的进阶用法:

    if 条件1

    then

        命令1

          else if 条件2

        then

            命令2

    else

        命令3

    fi

    举例说明下if语句的用法,示例如下:

    #!/bin/bash

    if [ "10" -lt "12" ]

    then

            echo "10确实比12小"

    else

            echo  "10不小于12"

    fi

    case语句语法如下:

    case 值 in

    模式1)

        命令1

        ;;

    模式2)

        命令2

        ;;

    *)

        命令3

        ;;

    esac

    case取值后面必须为单词in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有的命令都开始执行直至“;;”。模式匹配符“*”表示任意字符,“?”表示任意单字符,“[..]”表示类或范围中任意字符。

    case语句适合打印成绩或用于/etc/init.d/服务类脚本。以下面的脚本为例来说明下。

    #!/bin/bash

    #case select

    echo -n "Enter a number from 1 to 3:"

    read ANS

    case $ANS in

    1)

            echo "you select 1"

            ;;

    2)

            echo "you select 2"

            ;;

    3)

            echo "you select 3"

            ;;

    *)

            echo "`basename $0`: this is not between 1 and 3"

            exit;

            ;;

    esac

    下面是稍为复杂的实例说明,/etc/init.d/syslog脚本的部分代码如下,大家注意case语句的用法,可以以此为参考编写自己的case脚本:

    case "$1" in 

        start) 

            start 

            exit 0 

        ;; 

        stop) 

            stop 

            exit 0 

        ;; 

        reload|restart|force-reload) 

            stop 

            start 

            exit 0 

        ;; 

        **) 

            echo "Usage: $0 {start|stop|reload|restart|force-reload}"

            exit 1 

        ;; 

    esac 

    for循环语句的语法如下:

    for 变量名 in 列表

    do

        命令

    done

    若变量值在列表里,则for循环执行一次所有命令,使用变量名访问列表并且取值。命令可为任何有效的Shell命令和语句,变量名为任意单词。in列表可以包含列表、字符串和文件名,还可以是数值范围,例如{100..200},举例说明如下:

    #!/bin/bash

    for n in {100..200}

    do

             host=192.168.1.$n

             ping -c2 $host &>/dev/null

             if [ $? = 0 ]; then

                          echo "$host is UP"

             else

                          echo "$host is DOWN"

             fi

    done

    while循环语句的语法如下:

    while条件

    do

        命令

    done

    在Linux中有很多逐行读取一个文件的方法,其中最常用的就是下面脚本里的方法(管道法),而且这也是效率最高、使用最多的方法,笔者最喜欢用的也是管道法。为了给大家一个直观的感受,下面将通过生成一个大文件的方式来检验各种方法的执行效率。

    在脚本里,LINE这个变量是预定义的,并不需要重新定义,$FILENAME后面接系统中实际存在着的文件名。

    管道方法的命令语句如下:

    cat $FILENAME | while read LINE

    脚本举例说明如下:

    #!/bin/bash

    cat test.txt | while read LINE

    do

        echo $LINE

        done

    }

    相关资源:敏捷开发V1.0.pptx
    最新回复(0)