bash編程

前言

    bash(Bourne-Again SHell)是一種過程式編程語言、是人機交互接口,它是解釋型語言(源程序->解釋器去讀取執行)也稱爲動態語言,解釋型無法脫離解釋器獨立運行,bash是弱類型,保存變量方式一切皆字符。


概念

    腳本:將希望執行的命令羅列在文件中一起執行,bash沒有庫,整個程序都依賴於命令完成,在腳本中命令語句執行失敗並不影響後續命令執行,如果語法錯誤後續所有命令將不再執行。

           

    格式:第一行用於指定解釋器類型#!/bin/bash,其他以#開頭的都爲註釋行。


     bash變量:

             本地變量 :只對當前shell進程有效,其他shell和子shell進程無效 

             環境變量:當前shell和子shell進程有效,其他 shell進程無效

             局部變量:對某shell腳本代碼片段有效

             位置變量:記錄所傳參數對應信息,當傳遞參數大於等於10後需要{}如:${10},$#:顯示傳遞參數的個數。$@和$*:顯示所有參數內容、shift:把當前變量銷燬讓下一個變量取代當前變量位置

             特殊變量:有特殊意義的變量如:$?、$$


            控制語句:

                    順序執行:

                    選擇執行:多分支,當滿足條件後執行對應分支,if和case,case有多個測試條件時,case語句會使得語法結構更清晰。

                    循環執行:同一段代碼執行多次,必須有退出機制否則死循環,for、while、until,循環while和until(while適用於循環次數未知,或不便用for直接生成較大列表時使用)

                    循環執行中有2個命令可以控制循環跳出或結束操作

                    continue:跳出本次操作

                    break:跳出本循環


           變量賦值:向變量空間保存數據name=value。

           變量引用:讀取變量空間數據echo ${name}。

           撤銷變量:unset name。

           只讀變量:readonly name(當設置爲只讀變量後變量值將不能修改和撤銷)。

           查看當前shell進程中所有變量:set,

           查看當前shell中環境變量:export、printenv、env

           bash: 

                -n:scriptfile可做語法測試檢查、

                -x:顯示單步執行腳本結果


           bash配置文件:

                       profile類:爲交互式登錄用戶提供配置

                                  全局:/etc/profile和/etc/profile.d/*.sh

                                  個人:~/.bash_profile

                        bashrc類:爲非交互式用戶提供配置

                                  全局:/etc/bashrc 

                                  個人:~/.bashrc


            bash操作符(+、-、*、/、%、**)這些稱之爲雙目運算符


            整數比較:(-gt(>)、-lt(<)、-ge(>=)、-le(<=)、-eq(==)、-nq(!=))

            字符串比較:(<、>、=~(模式匹配)、==、!=)

                        還包括2個單目運算符:

                                -n 檢查文件內容是否爲空,不空爲真,空爲假

                                -z 和-n相反空爲真,不空假

             文件測試:

                      -e:存在爲真

                      -f:存在並且爲普通文件

                      -d:存在並且爲目錄、

                      -l或-L:存在併爲鏈接文件、

                      -s:存在並且爲非空文件、

                      -b:塊設備、

                      -c:字符設備、

                      -S:套接字文件、

                      -p:命名管道、

                      -r、-w、-x:存在並且可讀、可寫、可執行、

                      -nt: 雙目運算 判斷file1的mtime(修改時間)新於file2


              組合條件測試:(與(-a)&&、或(-o)||、非(-not)!)


              bash編程函數:函數名出現的地方,會被自動替換爲函數體,函數可自定義返回值,還可以接受位置參數。


              bash數組:bash中只支持一維數組並且支持稀疏格式,在引用是必須使用${}查看相關值。


選擇執行操作

       if:格式有三種

           1、 if 測試條件;then        2、if 測試條件;then     3、if 測試條件1;then
                  選擇分支                    選擇分支1                選擇分支1
               fi                          else                     elif 條件2;then
                                              選擇分支2                 分支2
                                           fi                       else 
                                                                         分支3
                                                                    fi

 if [ -d /media/sysroot$(dirname $i) ];then
              [ -f /media/sysroot$i ] || cp $i /media/sysroot$i
        elif [ ! -d /media/sysroot ];then
                mkdir -p /media/sysroot$(dirname $i)
              [ -f /media/sysroot$i ] ||  cp $i /media/sysroot$i
        else
             exit 3
        fi

      case:格式

                 case 變量引用 in

                 PATTERN1)

                           分支1

                            ;;

                  PATTERN2)

                            分支2

                           ;;

                   *)

                            分支n

                           ;;

                   esac

    

read -p "Please select the compression method(xz | gz | bz2):" Compression
etc="etc-`date +%Y-%m-%d-%H-%M-%S`"
case $Compression in
xz)
   tar Jcf "$etc.tar.xz" /etc/*
       if [ ! -d /backups ];then
            mkdir -p /backups
       fi

            mv "$etc.tar.xz" /backups/
       ;;
gz)
   tar zcf "$etc.tar.gz" /etc/*
       if [ ! -d /backups ];then
            mkdir -p /backups
       fi
            mv "$etc.tar.gz" /backups/
       ;;
bz2)
   tar jcf "$etc.tar.bz2" /etc/*
       if [ ! -d /backups ];then
            mkdir -p /backups
       fi
            mv "$etc.tar.bz2" /backups/
       ;;
*)
   echo "you inpot error:"
exit 5
;;
esac


循環執行操作

       for:格式

             for VAR_NAME in LIST;do 

                 循環體 

              done


for ((i=1;i<=9;i++));do
    for ((z=1;z<=$i;z++));do
         let tmp="$i*$z"
         arr[$z]="$i*$z=$tmp"
    done
         echo "${arr[@]}"
done

while測試條件爲真,進入循環,until和while相反,判斷爲假進入循環

     while:格式                                              until:格式               

            while 測試條件;do                                       while 測試條件;do 

                   循環體                                                   循環體

            done                                                      done


數組操作

    賦值:

        一次對多個元素賦值:例如:array=(red blue yellow green)

        按索引進行賦值:    例如:array=([0]=green [3]=red [2]=blue [6]=yellow)

        命令替換賦值:      例如:array=($(ls /opt/script/))或array=(/etc/sysconfig/*)

        用戶輸入賦值:      例如:read -a array,賦值後用echo ${array[0]}查看


     bash取值:

              echo ${#array[2]}。獲取這個數組字符的個數
              echo ${#array[*]}或echo ${#array[@]}。獲取這個數組中變量個數

              echo ${array[@]}。取出所有元素

              ${ARRAY[@]:offset:number}。例如:echo ${array[@]:1:1}

                         offset: 偏移的元素個數

                         number: 取出的元素的個數


字符串操作

     字符串操作

        字符串切片:${string:offset:length}。例如:${array[1]:0:5}可以對該數組內1的變量截取0-5個字符串。

        取尾部指定個數的字符:${string: -length},中間需要有個空格,從右向左取多少個字符。例如echo ${string: -3}


       取子串:
        基於非貪婪模式:${string#*word}:從左向右截取第一次出現該字符串後的值例如:echo ${string#*a}
        基於貪婪模式:${string##*word}:從左向右截取最後一次出現該字符串後的值例如:echo ${string#*a}
               ${string%word*}:從右向左取第一次出現該字符串後的值。例如:echo ${string%a*}
               ${string%word*}:從右向左取最後一次出現該字符串後的值。例如:echo ${string%%a*}


        查找替換:

               ${string/pattern/substi}: 替換第一次出現。例如:echo ${string/d/xxx}
               ${string//pattern/substi}:替換所有的出現。例如:echo ${string//d/xxx}
               ${string/#pattern/substi}:只替換行首echo ${string/#d/xxx}
               ${string/%pattern/substi}:只替換行尾echo ${string/%d/xxx}

   

       查找刪除:

               ${string/pattern}刪除第一次出現的字符
               ${string//pattern}刪除所有出現的字符
               ${string/#pattern}刪除行首出現的字符
               ${string/%pattern}刪除行尾出現的字符

 

       大小寫轉換:
                echo ${string^^}小-->大

                echo ${string,,}大-->小


      變量賦值:${parameter:-word}:如果變量值爲空將顯示指定字符串,不空顯示自身已有值,例如:${string:-test}
                ${parameter:=word}:如果變量值爲空將顯示指定字符串,變量將被賦值。例如:${string:=test}
                ${parameter:?word}:如果變量爲空將把指定字符串作爲錯誤信息顯示。${string:?error} 
                ${parameter:+word}:如果變量有值將顯示指定字符串,爲空將顯示空。例如:${string:+xxxx}

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