Linux Shell下條件語句

轉自:http://blog.csdn.net/evils798/article/details/8648010
Linux  Shell下條件語句:

1、	測試字符串之間的關係
        bash把所有的命令行和變量都看作字符串。一些命令如expr和test可以把字符當作數字進行操作。同樣任何數字也可以作爲字符串進行操作。 
  用戶可以比較兩個字符串相等或不等,也可以測試一個串是否賦了值。有關串的操作符如下:  
    str1 = str2      當兩個串有相同內容、長度時爲真 
    str1 != str2       當串str1和str2不等時爲真  
    -n str1         當串的長度大於0時爲真(串非空)  
    -z str1         當串的長度爲0時爲真(空串)  
    str1           當串str1爲非空時爲真  
     不但Shell程序可以使用test進行條件判斷,test命令也可以獨立執行,如:  
    $str1=abcd  
    $test $str1 = abcd  
    $echo $?  
    結果顯示:0  
與上例中第一行賦值語句中的等號不同,test命令中的等號兩邊必須要有空格。本例:test命令共有3個參數。注意兩個串相等必須是長度和內容都相等。 
    $str1="abcd "  
    $test "$str1" = abcd  
    $echo $?  
    結果顯示:1 
      上面str1包含5個字符,其中最後一個爲空格符。而test命令中的另一個串只有4個字符,所以兩串不等,test返回1。  
      不帶任何操作符和使用-n操作符測試一個串結果是一樣的,例如:  
    $str1=abce  
    $test $str1  
    $echo $?  
    結果顯示:0     
    $test -n $str1  
    $echo $?  
    結果顯示:0 
      但是,上面兩條命令也有一點差別,反映出了使用test命令潛在的問題,請看下例:  
    $str1="   "  
    $test $str1  
    $echo $?  
    結果顯示:1  
    $test -n "$str1"  
    $echo $?  
    結果顯示:0  
    $test -n $str1  
    結果顯示:
test:argument expected  
  上例中,第一次測試爲假因爲Shell在執行命令行之前首先要進行變量替換,即把$str1換成空格,然後shell又將命令行上的空格刪除,故 test命令測試到的爲空串。而在第二次測試中,變量替換後空格位於括號內,故不會被刪除,test測試到的是一個包含空格的串,在第三次測試中, shell把空格刪除,只把-n傳個test命令,所以顯示參數錯。
 
2、	測試兩個整數之間關係  
test命令與expr命令一樣,也可以把字符轉變成整數,然後對其操作。test命令對兩個數進行比較,使用的操作符如下:  
    int1 -eq int2    兩數相等爲真  
    int1 -ne int2    兩數不等爲真 
    int1 -gt int2    int1大於int2爲真 
    int1 -ge int2    int1大於等於int2爲真  
    int1 -lt int2    int1小於int2爲真  
    int1 -le int2    int1小於等於int2爲真  
  下面的例子反映了字符串比較與數字比較的不同:  
    $str1=1234  
    $str2=01234  
    $test $str1 = $str2  
    $echo $?  
    結果顯示:1  //0爲真,1爲假;
    $test $str1 -eq $str2  
    $echo $?  
    結果顯示:0   //0爲真,1爲假;

3、	有關文件的測試  
使用test進行的第三類測試是測試文件的狀態,用戶可以測試文件是否存在,是否可寫以及其他文件屬性。下面是文件測試時使用的選項。注意只有文件存在時,纔有可能爲真。  
  -r file     用戶可讀爲真  
  -w file     用戶可寫爲真  
  -x file     用戶可執行爲真  
  -f file     文件爲正規文件爲真  
  -d file     文件爲目錄爲真  
  -c file     文件爲字符特殊文件爲真  
  -b file     文件爲塊特殊文件爲真  
  -s file     文件大小非0時爲真  
  -t file     當文件描述符(默認爲1)指定的設備爲終端時爲真

4、	複雜的條件測試(and 、or 、not) 
    -a           與  
  -o          或  
   !          非 
  就是組合條件了,任何高級語言中都有的(NOT 、AND 、OR),例如: 
    $test -r em.null -a -s em.null 
    $echo $? 
    結果顯示:1 
    說明了em.null並不是可讀並且非空的文件 

5、	另一種執行test的方法  
    bash中還有另一種執行test命令的方法,就是把測試條件放到一對[ ]中,例如:  
    $int1=4  
    $[ $int1 -gt 2 ]  
    $echo $? 
    結果顯示:0  
要注意在[ 的後面和 ]符號的前面要有一個空格。  
  下面我們用test命令寫個簡單但比較完善的程序:  
    #-- 備份程序 
    #-- 檢查參數  
    if [ $# -ne 1 ]  
    then  
      echo "請在程序名後面指出要備份文件所在目錄!"  
      exit 1  
    fi  
    #-- 檢查目錄名是否有效  
    if [ !-d "$1" ]  
    then  
      echo "$1 不是一個目錄!" 
      exit 2  
    fi 
    cd $1  
    ls -a | cpio -o >/dev/mnt0  
    if [ $? -eq 0 ]  
    then  
      rm *  
    else  
      echo "cpio執行不成功!備份失敗..."  
      exit 3  
    fi
 
6、	空命令
        在Bsh中用 : 代表空命令,就是充個數,什麼都不做。
        
7、	嵌套if語句和else if 結構
        檢查條件1  
A:當條件1爲真,則執行一部分操作  
  B:若條件1爲假,檢查條件2  
    1)若條件2爲真,執行另外一部分操作  
    2)若條件2爲假,檢查條件3  
    3)若條件3爲真,執行其他一部分操作  
  語法如下:  
    if command  
    then  
      command  
    else  
      if command  
      then  
        command  
      else 
        if command  
        then  
          command  
        fi  
      fi  
    fi
 
8、	elif語句  
  嵌套if語句有時會給用戶帶來混亂,特別是什麼時候fi語句很難判斷。因此Bourne Shell又提供了elif語句。elif是else-if的縮寫,它表示是if語句的繼續。格式爲:  
    if command  
    then  
      command  
    elif command  
    then  
      command  
    elif command 
    then  
      command  
    fi 
上面介紹的嵌套if語句和elif語句完成相同的功能,用戶可以根據自己的喜好選擇一種使用。
 
9、	case語句  
前面說的elif語句替代if-then-else語句,但有時在編程時還會遇到對同一變量進行多次的測試,該情況可以用多個elif語句實現,但還有一種更簡單的方法就是用case語句。   
case語句不但取代了多個elif和then語句,還可以用變量值對多個模式進行匹配,當某個模式與變量值匹配後,其後的一系列命令將被執行,下面是case語句使用的語句。  
  case value in  
   pattem 1)  
    command  
    command;;  
   pattem 2)  
    command  
    command;;  
   ....  
   pattem)  
    command;  
  esac  
  case語句只執行其中的一組命令,當變量值與多個模式相匹配時,只有第一個匹配的模式對應的命令被執行。";;"表示該模式對應的命令部分程序。  
  通過學習下面的read語句,我們們再舉例子說明case語句的用法。

10、	read語句  
 Shell程序不但可以通過命令行參數得到輸入數據,還可以使用read命令提示用戶輸入數據,其語法格式爲:  
  read var1 var2... ...varn  
當Bash 遇到一個read語句時,在標準輸入文件中讀取數據直到一個換行符。此時Shell在解釋輸入行時,不進行文件名或變量的替換,只是簡單地刪除多餘的空格。然後Shell將輸入行的第一個字的內容給變量1,第二個給變量2,直到所有變量都賦上值或是輸入行爲空。若輸入行中字的個數超過變量個數, Shell將把輸入行中剩餘的所有字的內容都賦給最後一個變量。當變量個數多於輸入行字的個數時候,多於的變量將賦一個空值。輸入行的每一個字是由空格分隔的一個字母和數字組成的字符串。
 $read var1 var2 var3  
    輸入:Hello my friend 
  $echo $var1 $var2 $var3  
    結果顯示:Hello my friend  
  $echo $var2  
    結果顯示:my 

下面用個read和case的例子結束本部分的學習:  
  #--交互式備份,恢復程序  
  echo "輸入要備份文件所在目錄:\c"  
  read WORKDIR  
  if [ !-d $WORKDIR ]  
  then  
    echo "Sorry,$WORKDIR is not a directory"  
    exit 1  
  fi  
  cd $WORKDIR  
  echo "輸入選擇:"  
  echo _  
  echo "1.恢復到 $WORKDIR"  
  echo "2.備份 $WORKDIR"  
  echo "0.退出"  
  echo  
  echo "\c"  
  read CHOICE  
  case "$CHOICE" in  
echo "恢復中... ..."  
    cpio -i < /dev/mnt0;;  
echo "備份中... ..."  
    ls | cpio -o > /dev/mnt0;;  	
   0)exit 1  
   *)exit 1  
esac  
  if [ $? -ne 0 ]  
  then  
   echo "程序運行中出現錯誤!"  
  else  
   echo "操作成功!"  
fi    
  在上面代碼中,"*"定義了其他模式下不匹配時的默認操作。  
循環語句  
  前面介紹的程序和所學的語句都是從頭到尾成一條主線下來,或是成分支結構,在日常管理UNIX的過程中,經常要重複的做一些操作,處理批量的問題,這就涉及到了循環結構,同高級語言相似,UNIX的Shell也提供了強大的循環處理語句。  
  Bsh語言中有三種循環語句-while循環、until循環、for循環,下面通過具體的例子分別介紹這三種結構。  
While循環  
  在while循環語句中,當某一條件爲真時,執行指定的命令。語句的結構如下:  
while command  
do  
  command 
  command  
  … …  
done  
示例代碼如下:
  
#測試while循環小程序  
x_t=1  
  while [  $x_t -lt 5 ]  
  do  
     mm=` expr $x_t \* $int `  #注意"\"的作用
     echo "$mm"  
     x_t=` expr $x_t + 1 `   #注意expr的用法  
  done  
  echo "THE WHILE IS END!\n"  
程序的執行結果如下:  
1  
4  
9  
16  
THE WHILE IS END 
 
  在上述程序中,當變量x_t的值小於5的時候,執行while循環中的語句。在第五次循環時, [ $x_t-lt5]命令返回非零值,於是程序執行done後面的代碼。  
現在利用while循環,可以改進我們早些時候用的備份數據的例子,當用戶指定的目錄備份完畢後,使用while循環使程序執行一次可以備份多個用戶指定的目錄。代碼如下:  
echo "歡迎使用備份小程序"  
  ANS=Y  
  while [ $ANS = Y -o $ANS = y ]  
  do  
    echo _  
    #讀目錄名  
    echo "輸入要備份的目錄名:\c"  
    read DIR  
    if [ ! -d $DIR ]  
    then  
        echo "$DIR不是一個目錄!"  
        exit 1  
    fi  
    cd $DIR  
    echo "請選擇:"  
    echo _  
    echo "1 恢復數據到 $DIR"  
    echo "2 備份$DIR的數據"  
    echo  
    echo "請選擇:\c" 
    read CHOICE  
    case "$CHOICE" in  
       1) echo "恢復中… …"  
        cpio -i        2) echo "備份中… …"  
        cpio -o >/dev/rmt0;;  
       *) echo "選擇無效"  
    esac  
    if [ $? -ne 0 ]  
    then  
       echo "cpio執行過程中出現問題"  
       exit 2  
    fi  
    echo "繼續別的目錄嗎?(Y/y)\c"  
    read ANS  
  done  
在程序開始,我們給變量ANS符值爲Y,根據whlie的判斷條件,程序進入while循環,執行do-done中的語句,每次循環都要求用戶輸入 ANS的值用來判斷是否進行下次重複執行do-done中的語句。如果用戶輸入的條件不滿足while語句條件,循環結束,程序執行done後面的語句。

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