高階bash指令碼程式設計(1)
知識點
compound 和 comparison
-
-a 邏輯與 exp1 -a exp2 如果表示式 exp1 和 exp2 都為真的話,那麼結果為真。
-
-o 邏輯或 exp1 -o exp2 如果表示式 exp1 和 exp2 中至少有一個為真的話,那麼結果為真。
- 注意:這與Bash中的比較操作符 && 和 || 非常相像,但是這個兩個操作符是用在雙中括號結構中的。
-
[[ condition1 && condition2 ]]
- -o和-a操作符一般都是和test命令或者是單中括號結構一起使用的
-
if [ "\(exp1" -a "\)exp2" ]
操作符
- 賦值
- var=27 注意:在"="之後是不允許出現空白字元,不要混淆= 賦值操作符與 = (有空格)測試操作符
- 算術操作符
-
- 加法計算
-
- 減法計算
-
- 乘法計算
- / 除法計算
- ** 冪運算
- % 模運算,或者是求餘運算(返回一次除法運算的餘數)
- 位操作符
-
<< 左移一位(每次左移都相當於乘以2)
- <<= “左移-賦值”
-
let "var <<= 2" #這句的結果就是變數var左移2位(就是乘以4)
-
>> 右移一位(每次右移都將除以2)
-
>>= “右移-賦值”(與<<=正好相反)
-
& 按位與
-
&= “按位與-賦值”
-
| 按位或
-
|= “按位或-賦值”
-
~ 按位反
-
! 按位非
-
^ 按位異或XOR
- ^= “按位異或-賦值”
- 邏輯操作符
- 使用&&和||進行混合條件測試
- 雙中括號的if-test結構要比單中括號的if-test結構更加靈活.
- 其他混雜的操作符
-
, 逗號操作符可以連線兩個或多個算術運算。所有的操作都會被執行(可能會有負作用),但是隻會返回最後操作的結果。
變數
- 內建變數
- $BASH Bash的二進位制程式檔案的路徑(指令碼直譯器的路徑)
- $FUNCNAME 當前函式的名字
- $IFS 內部域分隔符,這個變數用來決定 Bash 在解釋字串時如何識別域,或者單詞邊界。
- \(REPLY 當沒有引數變數提供給 read 命令的時候,這個變數會作為預設變數提供給 read 命令。也 可以用於 select 選單,但是隻提供所選擇變數的編號,而不是變數本身的值。在個別版本的bash中,並不支援內建變數\)REPLY。
- 通過$*和$@列出所有的引數,"$" 所有的位置引數都被看作為一個單詞。 $@與 $ 相同,但是每個引數都是一個獨立的引用字串,這就意味著,引數是被完整 傳遞的,並沒有被解釋或擴充套件。這也意味著,引數列表中每個引數都被看作為單獨的單詞。
操作字串
- 字串長度
- echo ${#stringZ}
- expr length $stringZ
- 使用awk來處理字串
- 提取字串
-
echo | awk ' { print substr("'"${String}"'",3,4) # skid } '
- 等價於echo ${String:2:4} # 位置 3 (0-1-2), 4 個字元長
引數替換
- 處理和擴充變數
- ${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錯誤訊息。
- 變數長度/子串刪除
- \({#var} 字串長度(變數\)var得字元個數)。對於array來說,${#array}表示的是陣列中第一個元素的長度.
- ${var#Pattern}, \({var##Pattern} 從變數\)var的開頭刪除最短或最長匹配$Pattern的子串。 “#”表示匹配最短,“##”表示匹配最長
- ${var%Pattern}, \({var%%Pattern} 從變數\)var的結尾刪除最短或最長匹配$Pattern的子串。 “%”表示匹配最短,“%%”表示匹配最長。
- 變數擴充/子串替代
- ${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#*-} 也一樣,
- 因為#匹配最短的字串,
-
同時*匹配任意字首, 包括空字串.
指定變數的型別
-
declare/typeset選項
-r 只讀
-i 整型
-a 陣列
-f 函式
-x export變數的間接引用
- 間接引用
- 假設一個變數的值是第二個變數的名字。如果a=letter_of_alphabet並且letter_of_alphabet=z, 它被稱為間接引用。我們能夠通過引用變數a來獲得z,它使用eval var1=$$var2這種不平常的形式。
- eval a=$$a
-
傳遞一個間接引用給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
相關文章
- 高階bash/shell指令碼程式設計指南指令碼程式設計
- Bash 指令碼程式設計的一些高階用法指令碼程式設計
- 高階Bash指令碼程式設計指南 一個對指令碼程式設計技術的深入探討指令碼程式設計
- BASH Shell的指令碼程式設計(轉)指令碼程式設計
- Python 指令碼高階程式設計:從基礎到實踐Python指令碼程式設計
- Python 高階程式設計:深入探索高階程式碼實踐Python程式設計
- 我是如何開始踏上 bash 指令碼程式設計之路的?指令碼程式設計
- Bash指令碼15分鐘進階教程指令碼
- Linux_day06_01_Shell指令碼程式設計_Bash基礎Linux指令碼程式設計
- 【疑問】《JavaScript高階程式設計(第3版)》(1)JavaScript程式設計
- 【筆記】《JavaScript高階程式設計(第3版)》(1)筆記JavaScript程式設計
- Bash指令碼指令碼
- Rust 程式設計影片教程(進階)——027_1 高階特性Rust程式設計
- Bash指令碼15分鐘進階指導指令碼
- 程式程式設計1 – Unix環境高階程式設計7章讀書筆記程式設計筆記
- Oracle 高階程式設計 01 ~Oracle程式設計
- Linux Shell指令碼程式設計-基礎1Linux指令碼程式設計
- Rust 程式設計視訊教程(進階)——027_1 高階特性Rust程式設計
- Rust 程式設計影片教程(進階)——026_1 高階 trait1Rust程式設計AI
- 低階程式設計師和高階程式設計師的區別程式設計師
- windows核心程式設計--DLL高階Windows程式設計
- Javascript高階程式設計 備忘JavaScript程式設計
- C++高階程式設計pdfC++程式設計
- JavaScript高階程式設計筆記JavaScript程式設計筆記
- 重讀《JavaScript高階程式設計》JavaScript程式設計
- Python高階程式設計技巧Python程式設計
- shell程式設計-高階變數程式設計變數
- scala指令碼程式設計指令碼程式設計
- SELL 指令碼程式設計指令碼程式設計
- 《JavaScript高階程式設計第3版》-學習筆記-1JavaScript程式設計筆記
- Rust 程式設計視訊教程(進階)——026_1 高階 trait1Rust程式設計AI
- 執行shell指令碼報錯:-bash: ./test1.sh: /bin/bash^M: ...指令碼
- 四種聯結方法——《Oracle SQL 高階程式設計》筆記1OracleSQL程式設計筆記
- Bash 常用指令碼片段指令碼
- Bash 指令碼簡介指令碼
- bash 指令碼總結指令碼
- Shell 指令碼程式設計陷阱指令碼程式設計
- shell程式設計,實戰高階進階教學程式設計