天天看點

Linux叢集和自動化維2.3 Shell中的控制流結構

<b>2.3 shell中的控制流結構</b>

shell中的控制流結構也比較清晰,如下所示:

if ...then...

else...fi語句

case語句

for循環

until循環

while循環

break控制

continue控制

工作中用得最多的就是if語句、for循環、while循環及case語句,大家可以以這幾個為重點對象來學習。

if語句文法如下:

if 條件1

then

  指令1

else

  指令2

fi

if語句的進階用法:

    指令1

      else if 條件2

    then

        指令2

    指令3

舉例說明下if語句的用法,示例如下:

#!/bin/bash

if [

"10" -lt "12" ]

        echo "10确實比12小"

        echo 

"10不小于12"

case語句文法如下:

case 值 in

模式1)

    ;;

模式2)

    指令2

*)

esac

case取值後面必須為單詞in,每一模式必須以右括号結束。取值可以為變量或常數。比對發現取值符合某一模式後,其間所有的指令都開始執行直至“;;”。模式比對符“*”表示任意字元,“?”表示任意單字元,“[..]”表示類或範圍中任意字元。

case語句适合列印成績或用于/etc/init.d/服務類腳本。以下面的腳本為例來說明下。

#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;

下面是稍為複雜的執行個體說明,/etc/init.d/syslog腳本的部分代碼如下,大家注意case語句的用法,可以以此為參考編寫自己的case腳本:

case

"$1" in 

    start) 

        start 

        exit 0 

    ;; 

    stop) 

        stop 

    reload|restart|force-reload) 

    **) 

        echo "usage: $0

{start|stop|reload|restart|force-reload}"

        exit 1 

esac 

for循環語句的文法如下:

for 變量名 in 清單

do

    指令

done

若變量值在清單裡,則for循環執行一次所有指令,使用變量名通路清單并且取值。指令可為任何有效的shell指令和語句,變量名為任意單詞。in清單可以包含清單、字元串和檔案名,還可以是數值範圍,例如{100..200},舉例說明如下:

for n in

{100..200}

         host=192.168.1.$n

         ping -c2 $host &amp;&gt;/dev/null

         if [ $? = 0 ]; then

                      echo "$host is

up"

         else

down"

         fi

while循環語句的文法如下:

while條件

在linux中有很多逐行讀取一個檔案的方法,其中最常用的就是下面腳本裡的方法(管道法),而且這也是效率最高、使用最多的方法,筆者最喜歡用的也是管道法。為了給大家一個直覺的感受,下面将通過生成一個大檔案的方式來檢驗各種方法的執行效率。

在腳本裡,line這個變量是預定義的,并不需要重新定義,$filename後面接系統中實際存在着的檔案名。

管道方法的指令語句如下:

cat $filename |

while read line

腳本舉例說明如下:

#!/bin/bash

cat test.txt |

    echo $line

    done

}

繼續閱讀