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 #

 

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