天天看點

linux bash腳本程式設計

bash腳本語言是一種解釋性語言,執行時通過解釋器執行,不需要編譯。

一、變量

        本地變量:使用格式為varname=值,本地變量的聲明周期為整個腳本程序

        局部變量:使用格式為local varname=值,局部變量的聲明周期為整個腳本程序

        環境變量:使用格式為export varname=值,作用域為目前shell程序及子程序。指令腳本在執行時,會啟動shell的子程序,指令行中啟動的腳本會繼承目前的shell環境變量,系統自動執行腳本(非指令行啟動)就需要自我定義環境變量

        位置變量:$1,$2...表示引用的參數

        shift:踢出參數  shift n:表示踢出n個參數

        特殊變量:$?儲存了上一個指令執行的狀态傳回值(程式執行可能有兩類傳回值,一種是執行的狀态傳回值,一種是執行指令的傳回值),程式狀态傳回代碼:(0-255), 0:表示執行正确,1-255:都是錯誤的

        撤銷變量:unset 變量名稱         eg:unset A

        檢視目前shell中的變量:set

        檢視目前shell中的環境變量:printenv,env,export

        在原來的值後面補加一個值:

      ANIMALS=pig

      ANIMALS=$ANIMALS:gost

      執行結果:pig:gost

二、算術運算

        使用let指令做運算:let C=$A+$B

  $[算數運算表達式]:C=$[$A+$B]

  $((運算表達式)):  C=$(($A+$B))

  expr算數運算表達式,表達式中各操作及運算符之間要有空格,而且要使用反引号将指令引用(輸入法切換到英文,波浪号鍵即為反引号鍵):

        C=`expr $A + $B`

三、條件測試

        條件測試類型:

        整數測試,字元測試,檔案測試

       3種測試指令:

                          test 表達式                   eg: if test $A -eq $B;then echo "deng"; else echo "budeng"; fi

                          [ 表達式 ]                      eg: if [ $A -eq $B ];then echo "deng"; else echo "budeng"; fi

                          [[ 表達式 ]]              eg: if [[ $A -eq $B ]];then echo "deng"; else echo "budeng"; fi

                          注意:後兩種表達式前後必須有空格

        數值測試:

    -eq:是否相等

    -ne:是否不等

    -ge:是否大于等于

    -le:是否小于等于

    -gt:是否大于

    -lt:是否小于

  字元串測試:

    =或==:是否等于

    >:是否大于

    <:是否小于

    !=:是否不等于

    =~:左側字元串是否能夠被右側PATTERN所比對  [[  ]]中使用

    -z "STRING":測試字元串是否為空,空則為真

    -n "STRING":測試字元串是否非空,不空則為真

    注意:用于字元串比較時用到的操作數都應該使用引号括起來

  檔案測試:

     存在性測試:

        -a FILE:同下

        -e FILE:檔案存在性測試,存在為真,否則為假

     存在性及類别測試:

        -b FILE:是否存在且為塊裝置檔案

        -c FILE:是否存在且為字元裝置檔案

        -d FILE:是否存在且為目錄檔案

        -f FILE:是否存在且為普通檔案

        -h FILE 或-L FILE:是否存在且為符号連結檔案 

        -p FILE:是否存在且為命名管道檔案

        -S FILE:是否存在且為套接字檔案

      檔案權限測試:

        -r FILE:是否存在且可讀

        -w FILE:是否存在且可寫

        -x FILE:是否存在且可執行

      檔案特殊權限測試:

        -g FILE:是否存在且擁有sgid權限

        -u FILE:是否存在且擁有suid權限

        -k FILE:是否存在且擁有sticky權限

      檔案大小測試:

        -s FILE:是否存在且非空

      檔案是否打開:

        -t  fd:fd表示檔案描述符是否已經打開且與某終端相關

      其它:

        -N FILE:檔案自從上一次被讀取之後是否被修改過

        -O FILE:目前有效使用者是否為檔案屬主

        -G FILE:目前有效使用者是否為檔案屬組

      雙目測試:

        FILE1 -ef FILE2:FILE1與FILE2是否指向同一個裝置上的相同inode

        FILE1 -nt FILE2:FILE1是否新于FILE2

        FILE1 -ot FILE2:FILE1是否舊與FILE2

        組合條件測試:

    邏輯運算:

        [  ]中使用:

         EXPRESSION1 -a EXPRESSION2:2個條件同時為真,則結果為真

         EXPRESSION1 -o EXPRESSION2:2個條件中其中一個條件為真,則結果為真

         ! EXPRESSION:條件為假時,則結果為真

        [[  ]]或[  ] ** [  ]中使用:  注:**為&&或||

         &&: 左右兩邊條件或指令同時為真,則結果為真

         ||:左右兩邊條件或指令其中一個為真時,則結果為真

         !:條件或指令為假時,則結果為真

      注:[  ]中使用小括号需要轉義即\(\),[[  ]]則無需轉義

四、條件判斷控制結構

        單分支的if語句:

      if 判斷條件; then

      statement1

      statement2

      fi

  雙分支的if語句:

      if 判斷條件; then

      statement1

      statement2

      else

      statement3

      statement4

      fi

  多分支的if語句

      if 判斷條件;then

      statement1

      ...

      elif 判斷條件;then

      statement2

      ...

      elif 判斷條件;then

      statement3

      ...

      else

      statement4

      ...

      fi

五、case分支選擇結構

        case $變量 in

        值1)指令 ;;

        ...

        值n)指令 ;;

        *)  預設指令;;

        esca

注意每個條件末尾都是兩個分号。

        bash分支選擇結構當中沒有break,但是兩個分号就代表break的含義。c語言中每個條件(case語句)後面不一定都要有break,如果沒有break,則繼續執行下面的條件的語句,即多個分支共用一組語句。如果你想在bash中像c語言那樣多個條件共用一套語句,可以在分支末尾使用一個分号加一個and符号,eg:

case $ans in

              y);&

              Y) echo "我也是";;

              n);&

              N) echo "sorry,跟你沒什麼好談的";;

              esac

除了 ;&結束語句以外,還有一種是 ;;& 來結束語句的用法。但是意義有所不同,;;&的用法是使得條件越來越精确。

                                 eg:

case $num in

               *)echo -n "中國";;&

                   03*)echo -n "河北省";;&

                        ??10)echo "邯鄲市";;

                        ??11)echo "石家莊";;

                        ??17)echo "滄州市";;

                   07*)echo -n "江西省";;&

                        ??91)echo "南昌市";;

                        ??92)echo "九江市";;

                        ??97)echo "贛州市";;

               esac

六、循環控制結構

       for 變量 in 清單;do //形式1                     eg:for i in {1..20} ; do

              表達式                                                              echo $i

       done                                                                  done

       for ((expr1;expr2;expr3));do //形式2,近似于C語言

              表達式

       done

  while CONDTION;do

         表達式

  done

        進入循環,條件滿足

        退出條件,條件不滿足

  until CONDITION;do

         表達式

  done

        進入循環,條件不滿足

        退出循環,條件滿足

        在while,until , for循環結構中

      break:提前退出循環

      continue:提前進入下一輪循環

七、函數

        函數是實作結構化程式設計重要的思想,主要目的是實作代碼重用

    定義一個函數:

      function FUNCNAME             //形式1

      {

              函數體

      }

      FUNCNAME()          //形式2,函數名緊跟小括号不能加空格

                        {

                    函數體

      }

      調用隻需要使用函數名即可

      bash -x 腳本名 檢視腳本執行的過程

    注意:函數的執行結果和函數的執行狀态結果是不同的

      引用函數的執行結果:變量=`函數名`

      引用函數的狀态結果:函數調用之後 echo $?

      腳本的執行狀态結果取決于執行的最後一個指令

    自定義執行狀态傳回值 return #

繼續閱讀