高階bash指令碼程式設計(1)

hai0808發表於2017-11-20

知識點

compound 和 comparison

  • -a 邏輯與 exp1 -a exp2 如果表示式 exp1 和 exp2 都為真的話,那麼結果為真。

  • -o 邏輯或 exp1 -o exp2 如果表示式 exp1 和 exp2 中至少有一個為真的話,那麼結果為真。

  • 注意:這與Bash中的比較操作符 && 和 || 非常相像,但是這個兩個操作符是用在雙中括號結構中的。
  • [[ condition1 && condition2 ]]

  • -o和-a操作符一般都是和test命令或者是單中括號結構一起使用的
  • if [ "\(exp1" -a "\)exp2" ]

操作符

  1. 賦值
  • var=27 注意:在"="之後是不允許出現空白字元,不要混淆= 賦值操作符與 = (有空格)測試操作符
  1. 算術操作符
    • 加法計算
    • 減法計算
    • 乘法計算
  • / 除法計算
  • ** 冪運算
  • % 模運算,或者是求餘運算(返回一次除法運算的餘數)
  1. 位操作符
  • << 左移一位(每次左移都相當於乘以2)

  • <<= “左移-賦值”
  • let "var <<= 2" #這句的結果就是變數var左移2位(就是乘以4)

  • >> 右移一位(每次右移都將除以2)

  • >>= “右移-賦值”(與<<=正好相反)

  • & 按位與

  • &= “按位與-賦值”

  • | 按位或

  • |= “按位或-賦值”

  • ~ 按位反

  • ! 按位非

  • ^ 按位異或XOR

  • ^= “按位異或-賦值”
  1. 邏輯操作符
  • 使用&&和||進行混合條件測試
  • 雙中括號的if-test結構要比單中括號的if-test結構更加靈活.
  1. 其他混雜的操作符
  • , 逗號操作符可以連線兩個或多個算術運算。所有的操作都會被執行(可能會有負作用),但是隻會返回最後操作的結果。

    變數

  1. 內建變數
  • $BASH Bash的二進位制程式檔案的路徑(指令碼直譯器的路徑)
  • $FUNCNAME 當前函式的名字
  • $IFS 內部域分隔符,這個變數用來決定 Bash 在解釋字串時如何識別域,或者單詞邊界。
  • \(REPLY 當沒有引數變數提供給 read 命令的時候,這個變數會作為預設變數提供給 read 命令。也 可以用於 select 選單,但是隻提供所選擇變數的編號,而不是變數本身的值。在個別版本的bash中,並不支援內建變數\)REPLY。
  • 通過$*和$@列出所有的引數,"$" 所有的位置引數都被看作為一個單詞。 $@與 $ 相同,但是每個引數都是一個獨立的引用字串,這就意味著,引數是被完整 傳遞的,並沒有被解釋或擴充套件。這也意味著,引數列表中每個引數都被看作為單獨的單詞。

操作字串

  1. 字串長度
  • echo ${#stringZ}
  • expr length $stringZ
  1. 使用awk來處理字串
  • 提取字串
  •    echo | awk '
    {
    print substr("'"${String}"'",3,4)      # skid
    }
    '
  • 等價於echo ${String:2:4} # 位置 3 (0-1-2), 4 個字元長

引數替換

  1. 處理和擴充變數
  • ${parameter-default} 如果變數 parameter 沒被宣告,那麼就使用預設值。
  • ${parameter:-default} 如果變數 parameter 沒被設定,那麼就使用預設值。
  • ${parameter=default} 如果變數parameter沒宣告,那麼就把它的值設為default。
  • ${parameter:=default} 如果變數parameter沒設定,那麼就把它的值設為default。
  • ${parameter+alt_value} 如果變數parameter被宣告瞭,那麼就使用alt_value,否則就使用null字串。
  • ${parameter:+alt_value} 如果變數parameter被設定了,那麼就使用alt_value,否則就使用null字串。
  • ${parameter?err_msg} 如果parameter已經被宣告,那麼就使用設定的值,否則列印err_msg錯誤訊息。
  • ${parameter:?err_msg} 如果parameter已經被設定,那麼就使用設定的值,否則列印err_msg錯誤訊息。
  1. 變數長度/子串刪除
  • \({#var} 字串長度(變數\)var得字元個數)。對於array來說,${#array}表示的是陣列中第一個元素的長度.
  • ${var#Pattern}, \({var##Pattern} 從變數\)var的開頭刪除最短或最長匹配$Pattern的子串。 “#”表示匹配最短,“##”表示匹配最長
  • ${var%Pattern}, \({var%%Pattern} 從變數\)var的結尾刪除最短或最長匹配$Pattern的子串。 “%”表示匹配最短,“%%”表示匹配最長。
  1. 變數擴充/子串替代
  • ${var:pos} 變數var從位置pos開始擴充套件, 也就是pos之前的字元都丟棄。
  • ${var:pos:len} 變數var從位置pos開始,並擴充套件len個字元。
  • ${var/Pattern/Replacement} 使用Replacement來替換變數var中第一個匹配Pattern的字串。
  • ${var//Pattern/Replacement} 全域性替換。所有在變數var匹配Pattern的字串,都會被替換為Replacement。
  • ${var/#Pattern/Replacement} 如果變數var的字首匹配Pattern,那麼就使用Replacement來替換匹配到Pattern的字串。
  • ${var/%Pattern/Replacement} 如果變數var的字尾匹配Pattern,那麼就使用Replacement來替換匹配到Pattern的字串
  • t=${var1#*-} 也一樣,
  • 因為#匹配最短的字串,
  • 同時*匹配任意字首, 包括空字串.

    指定變數的型別

  1. declare/typeset選項
    -r 只讀
    -i 整型
    -a 陣列
    -f 函式
    -x export

    變數的間接引用

  2. 間接引用
    • 假設一個變數的值是第二個變數的名字。如果a=letter_of_alphabet並且letter_of_alphabet=z, 它被稱為間接引用。我們能夠通過引用變數a來獲得z,它使用eval var1=$$var2這種不平常的形式。
    • eval a=$$a
  3. 傳遞一個間接引用給awk
    多行的awk指令碼的呼叫方法為: awk ' ..... '
    ```
    awk指令碼開始.
    ------------------------------------------------
    awk "

{ total += $${column_number} # 間接引用
}
END {

print total
}

" "$filename" ------------------------------------------------
awk指令碼結束.

```

雙圓括號結構

與let命令很相似,((...)) 結構允許算術擴充套件和賦值。 如,a=$(( 5 + 3 )),將把變數“a”設為“5 + 3”,或者8;(( a = 23 )) .

實驗截圖

3-1:


3-2:


3-2除錯

3-3:


3-4:


3-5


3-6

相關文章