天天看點

shell程式設計

   說到shell程式設計之前,先介紹變量,變量在shell程式設計中是很重要。變量無非就是一堆可變化的值。

   變量的的聲明遵循以下幾條規則:

   一,不能跟系統中的變量名重名。如PATH是系統變量,在聲明時不要也用PATH當作變量名。

   二,不能以數字開關,12USER=bingo這是錯誤的,最前面不是數字的話,就認為合法,當然變量名隻有二種情況,要麼全部是英文,要麼是英文跟數字組合。等号的兩邊不能有空格,USERNAME= bingo這種情況聲明的USERNAME是空值,且會把bingo當作指令來執行 ,USERNAME = bingo 這種情況會USERNAME當作指令來執行 ,USERNAME =bingo這種情況會USERNAME當作指令來執行。

   三,變量内容沒有限制,如果變量内容裡還有變量,則必須用雙引号,不能會出現變量無法替換,如果變量内容有特殊字元則需用\這個跳脫字元将它原來的意義給注釋掉,使它變成一個普通的字元來使用。

   四,取消變量用unset,如unset USERNAME.

對變量做基本的介紹下面介紹三種條件測試

(1) test expresstion :用于檢查檔案與比較有效值 

(2) [ expreesstion ](判斷符号):與test作用一樣,在腳本中這種寫法很常見

(3) ` expresstion `:一般判斷常數之間的大小

(4)指令執行有兩種狀态:一種叫做指令執行的結果,一種是指令執行結果的狀态傳回值,

<a href="http://blog.51cto.com/attachment/201206/175023548.jpg" target="_blank"></a>

<a href="http://blog.51cto.com/attachment/201206/175449726.jpg" target="_blank"></a>

(5)指令的引用兩種方式``與$(): echo “kernel-`uname -r`" 與echo "kernel-$(uname -r)”。(``反單号,在esc鍵的下面)效果都一樣

(6)算術運算:sum=$(($var1+$var2))與sum=$[$var1+$var2]效果一樣

(7)位置參數:執行腳本為$0這個變量,第一個接的參數是$1,第二個是$2,依次累推

<a href="http://blog.51cto.com/attachment/201206/195028509.jpg" target="_blank"></a>

下面介紹if的用法。if 用于條件判斷。

1,  if 條件測試 ;then

     語句...

    fi (表示結束if語句)

  (1) if test 2 -lt 3;then

         echo "this is right."

  fi

  (2)if [ 2 -lt 3 ];then (注意要與[  ]之間有空格

        echo "this is right"

   fi

(3)  if [[ 2&lt;3 ]];then

        echo “this is right”

    fi

2,if 條件測試;then(如果條件測試傳回的值為真,則執行語句一,否則執行語句二)

      語句一....

    else

      語句二....

(1)if  [ 4 -lt 3 ];then 

      echo "this is right."

else  

       echo "this is wrong."

fi

(2) if id root &amp;&gt; /dev/null;then(if後面可以寫指令,&amp;&gt; /dev/null把id指令執行的執行結果輸入到/dev/null,可把/dev/null當作黑洞,永遠都填不滿)

          echo "user exist."

     else

          echo "user not exist."

3,  if 條件測試1;then

       語句一...

    elif 條件測試2;then (elif可以有多個)

       語句二...

        語句三...

   read -p “please input (y/n):." yn(提示使用者輸入y/n,并将值存儲在變量yn中)

     if  [ "$yn" = "y" -o "$yn" == "Y" ];then

        echo "ok,continue"

    elif [ "$yn"= "n"  -o "$yn"="N" ];then

        echo "break."

          echo "input error."

4, case常用于變量的值有多種的時候

case  變量名 in 

 "第一個變量内容")

      語句1....

"第二變量内容”)

     語句2....

*)  (*表示既不是第一個變量内容也不是第二變量内容)

      語句3.....

esac

case "$1" in($1是位置參數,

start)

       service network start;; 

stop)

      service network stop;;

reload)

      sevice network reload;;

restart)

      service network restart;;

*)

echo "Usage: `basename $0` {start|stop|reload|restart}";;

5,for循環,一般用于知道要循環幾次。

for 變量名  in  變量值 ;do

   語句1....

done

sum=0

for i in `seq 1 100`;do(seq 是表示從1到100都循環一次,加``表示先執行seq,得到seq命執行結果)

     sum=$(($i+$sum))

     let  i++ (讓變量自動加1)

echo "total $sum."

6,while 循環用于變量值不固定的時

while 條件判斷;do(條件滿足時就循環)

   語句...

 計算從1到100偶數之和

i=0

while [ $i -le 100 ];do

      sum=$(($sum+$i))

      let i+=2

echo "total $sum"

7,until 循環正好與while相反,當條件不滿足時循環

until 條件判斷 do;

    語句

until [ $i -ge 100 ];do

     sum=$(($sum+$i)

     let i++

8,function(函數):簡單來說實作代碼重複調用。遵循先定義後調用

定義函數兩種方式

(1)function fname {

語句.....

}(function 是關鍵字,fname是函數名

(2) fname () {

語句...

FUSER () {

    if id $1 &amp;&gt; /dev/null;then

         echo "user uid: `id -u $1`,user shell:`grep "^$1\&gt;:" /etc/passwd`

    esle

         echo "no this user."

}(定義了一個FUSER是函數名,大小寫都無所謂)

read -p "input user:" USERNAME

while [ "$USERNAME" != "quit" ];do

      FUSER $USERNAME(給函數傳遞參數也就是$1)

      read -p "next user:" USERNAME

 done

9, continue:退出目前這一次循環,提前進入下一次循環

  i=0

  sum=0

      if [ $[$%2] -eq 1 ];then

      let i++

     continue (如果i是奇數,則又從while開始循環)

      fi

      let sum=$(($sum+$i))

echo "even total: $sum"

10, break: 中斷目前循環

read -p "input username:" UNAME

while true;do(true表示不用做判斷,開始循環)

    if id $UNAME &amp;&gt; /dev/null;then

          echo “user uid: `id -u $UNAME &amp;&gt; /dev/null`

           echo "no a user: $UNAME."

     fi

     read -p "n|N for next user,others for quitting."choice

           case $choice in 

             n|N)

                read -p "a username:" UNAME;;

             *)

                 break ;;(中止循環,并退出)

            esac

    done

本文轉自 deng304749970 51CTO部落格,原文連結:http://blog.51cto.com/damondeng/900301,如需轉載請自行聯系原作者