最近需要學習有關shell的知識,蒐集的資料

lynnucas發表於2016-07-11
shell指令碼入門篇
簡介

       通常情況下,我們從命令列輸入一個命令就能得到系統的響應。但是,當我們要一個接一個的輸入命令而只是希望得到最後的結果時,這樣做就顯得沒有效率了。要達到這樣的目的,我們利用shell指令碼來實現。

shell引數
位置引數

       由系統提供的引數稱為位置引數。位置引數的值可以用$N得到,N是一個數字,即,如果N=1,那麼位置引數為$1,和c語言中的陣列比較類似。Linux中,會把輸入的命令字串進行分段並進行編號,從0開始。第0號表示為程式名字,從1開始就是表示傳遞給程式的引數。例如:$0表示程式的名字,$1表示傳遞給程式的第一個引數,依次類推。

內建引數

       在上一節中說到$0,是一個內建引數,是必須的,而像$1則是可有可無的。和$0一樣的內部變數還有一下幾個:

       $#:傳遞給程式的引數數量

       $?:上一個程式碼或者shell程式在shell中退出的返回值,如果正常退出則返回0,反之返回非0數。

       $*:傳遞給程式的所有引數組成的字串。

       利用內建引數別寫刪除一個檔案的指令碼。

       例:

              

點選(此處)摺疊或開啟

  1. #name :del
  2. #this program to compress a file to thedustbin
  3. if test $# -eq 0
  4. then
  5. echo “please specify a file”
  6. else
  7. gzip $1
  8. mv $1.gz $HOME/dustbin
  9. echo “file $1 is deleted!”
  10. fi


 

       首先在目錄下面建立一個空白檔案,用於測試。

              touch 1

       執行指令碼程式:sh del.sh 1

       程式執行完後,提示檔案已經刪除。然後再ls一把,檢視1檔案是否還存在。

變數表示式

       上面的程式中,用到了一個關鍵字test,他是shell程式中的一個表示式比較。通過和shell提供的if等條件語句相結合可以方便的判斷。

       其用法如下:

       test 表示式

       表示式所代表的操作符有字串操作符、數字操作符、邏輯操作符以及檔案操作符。

字串比較

       作用:測試字串是否相等、長度是否為0,字串是否為NULL(注:bash區分零長度字串和空字串)

       字串操作符:

       =:比較兩個字串是否相同,相同則為“是”;

       !=:比較兩個字串是否相同,不同則為“是”;

       -n:比較字串長度是否大於0,如果大於0則為“是”;

       -z:比較字串長度是否等於0,如果等於則為“是”;

       數字比較符:

       -eq:相等

       -ge:大於等於

       -le:小於等於

       -ne:不等於

       -gt:大於

       -lt:小於

       邏輯操作:

       !:取反,與一個邏輯值相反的邏輯值。

       -a:與(and),兩個邏輯值為“是”,返回值為“是”,反之為“否”

       -o:或(or),兩個邏輯值有一個為“是”,返回值就為“是”

       檔案操作:

       檔案測試表示式通常是為了測試檔案資訊,一般由指令碼來決定檔案愛你是否應用備份、複製和刪除。常用的檔案操作符有:

       -d:物件存在而且是目錄返回“是”

       -f:物件存在而且是檔案返回“是”

       -L:物件存在而且為符號連線返回“是”

       -r:物件存在而且可讀則返回“是”

       -s:物件存在而且長度非零則返回“是”

       -w:物件存在而且可寫則返回值為“是”

       -x:物件存在而且可執行則返回“是”

     迴圈結構語句

       shell中常見的迴圈語句有for迴圈、while迴圈、until迴圈。

       for迴圈

       語法:for 變數 in 列表

              do

              操作

              done

       變數是要在迴圈列表內部用來指代當前所指代的別表中的那個物件的。

       列表是在for迴圈的內部要操作的物件,可以是字串也可以是檔案,如果是檔案,那麼列表就是檔名了。

       例:刪除垃圾信箱中的.gz檔案

             

點選(此處)摺疊或開啟

  1. # delete all file with extension of “gz” in the dustbin
  2. for I in $HOME/dustbin/*.gz
  3. do
  4. rm ?CF $i
  5. echo “$i has been deleted”
  6. done


 

       while迴圈

       語法:while表示式

              do   

              操作

              done

       只要while表示式成立,dodone之間的操作就會一直在進行

       until迴圈

       語法:until 表示式

              do

              操作

              done

       重複dodone之間的操作直到表示式成立。

               

點選(此處)摺疊或開啟

  1. #test until
  2. #add from 1 to 100
  3. total=0
  4. num=0
  5. until test num –eq 100
  6. do
  7. total=`expr $total + $num`
  8. num=`expr $num + 1`
  9. done
  10. echo “the result is $total”


 

     條件語句

       shell中的條件語句主要有if語句、case語句

       if語句

       語法:if 表示式1 then

              操作

              elif 表示式1 then

              操作

              elif 表示式3 then

              操作

              ……..

              else

              操作

              fi

       shell裡的if結束標誌是將if反過來寫成fi;而elif其實就是else if的縮寫。

       case語句

       語法:case 字串 in

              1|3)

              操作;;

              2|4)

              操作;;

              ……

              *)

              操作;;

              ease

              case的作用就是當字串與某個值相同就執行那個值後面的操作。如果同一個操作對應多個值,則使用“|”將各個值分開。

       例:

             

點選(此處)摺疊或開啟

  1. case $USER in
  2. csj)
  3. echo “you are csj”;;
  4. root)
  5. echo “you are root”;
  6. echo “welcome!”;;
  7. *)
  8. echo “who are you? $USER”;;
  9. esac


   

       執行這個指令碼,程式根據你的登入使用者名稱,列印相關的資訊。

 

補充:1、程式必須是以#!/bin/sh開始,是用來告訴系統後面的引數是用來執行該文的程式。

       2、命令

       read var:提示使用者輸入,並將輸入值賦給變數。

       sort file:對檔案中的行進行排序。

       expr:進行數學運算。

       tee:將資料輸出到標準輸出裝置和檔案。

       dirname file:返回檔案所在的路徑。

       head file:列印檔案的開頭幾行,預設是10行,通過-n指定行數。

       tail file:列印文字檔案末尾幾行,預設是10行,通過-n指定行數。

       管道:將一個命令的結果做另一個命令的輸入。

              grep hello file | wc –l

       重定向:將命令的結果輸出到檔案,而不是標準輸出。

       >:寫入檔案並覆蓋舊檔案的內容

       >>:加到檔案的末尾,保留舊檔案內容。

相關文章