shell指令碼程式設計學習筆記——變數
N年前心血來潮把鳥哥linux私房菜一頓學,結果時隔多年功力盡散,事實證明進入工作後,最高效的學習方式還是圍繞面臨的問題去學習。當然也不是說不用做技術儲備,拓寬技術面是必要,但要系統性學習一門技術,最好是用來解決眼下的問題。
最近開始接觸ci,發現裡面的shell指令碼都能看得懂,但要想優化改造就犯難了。需要重新對shell script做個梳理。
shell變數
變數宣告
key="value"
- 與很多其他語言不同,等號左右不能有空格。
- 變數名稱只能使用英文字母,數字和下劃線,首個字元不能以數字開頭。
變數使用
使用一個已經被定義過的變數時,在變數名前加 $
符號,可以用 {}
包含變數名。
name="George" # $變數名 echo "my name is $name" prefix="foot" # ${變數名} echo "i like play ${prefix}ball"
加 {}
是為了幫助直譯器識別變數的邊界。作為最佳實踐,可以為所有變數加上 ${}
。
字串變數
shell變數最常用的資料型別就是字串。另一種是陣列,後面再介紹。
對變數賦值字串時,支援使用雙引號、單引號,也可以不加引號。
可以使用其他變數值對變數賦值
name=George alias=${name}
當變數值中需要包含空格時,需要用引號(單雙引號都支援)括起來。不加括號時shell執行會報錯。
t1="this is a nice day" t2='yes,it is' # 以下shell執行時會報錯 info: command not found。因為shell會把空格後的info當成指令執行 t3=error info
shell定義字串變數時是支援拼接的,只要各個字串值之間沒有空格。
t1="hi there" # 雖然shell能正常執行以下程式碼,但可讀性太差。 t2=${t1},this" is mike" # 以下程式碼具備更強的可讀性。 t2="${t1},this is mike"
雙引號中可以使用 ${}
引用指定變數。而在單引號中,任何字元都會原樣輸出。
t1="hi there" t2="${t1},this is mike" t3='${t1},this is mike'
以上t2的實際值為"hi there,this is mike",而t3的值為"${t1},this is mike"。
在雙引號中,可以通過轉譯字元 \
實現單引號相同功能
t1="hi there" t2="\${t1},this is mike"
建議統一使用雙引號。
獲取字串長度
name="George" # 使用`${#變數名}`獲取變數屬性值的長度 echo ${#name}
字串截位
t1="it's a good day" # 使用${變數名:from:length}獲取從from開始,長度為length的字串 # 以下例項從字串第 7 個字元開始擷取 4 個字元,結果就是"good" echo ${t1:7:4}
陣列變數
用括號來表示陣列,陣列元素用“空格”符號或“回車”分割開。還可以單獨定義陣列的各個分量。
array1=("value0" "value1" "value2" "value3") array2=( "v0" "v1" "v2" ) array2[3]="v3" array2[4]="v4"
讀取陣列
# ${陣列名[下標]} echo ${array1[0]} # 使用 [@] 或 [*] 符號可以獲取陣列中的所有元素 echo ${array1[@]} echo ${array2[*]}
陣列的長度
獲取陣列長度的方法與獲取字串長度的方法相同
array=(0 1 2 3 4) # 使用`${#陣列變數名[@]}`獲取陣列長度 echo ${#array[@]}
一維陣列
shell只支援一維陣列(不支援多維陣列)
arr1=(1 2 3 4) arr2=(5 6 7 8) # 以下程式碼並不是構建一個二維陣列,而是將兩個陣列打平後拼接在一起。 arr=(${arr1[@]} ${arr2[@]}) # arr實際值為 1 2 3 4 5 6 7 8 echo ${arr[@]} # arr長度為 8 echo ${#arr[@]}
只讀變數
name="George" readonly name name="Carol" echo ${name}
通過readonly可將指定變數設定為只讀。上面一段shell執行到第三行時,會提示錯誤:err.sh: line 3: name: readonly variable。
刪除欄位
unset var_name
變數被刪除後不能再次使用。unset 命令不能刪除只讀變數。
「其他文章」
- 產品說明丨Android端使用MobPush快速整合方法
- 不要在 Python 中使用迴圈,這些方法其實更棒!
- 分享 6 個 Vue3 開發必備的 VSCode 外掛
- 微服務架構的外部 API 整合模式
- 前端該如何優雅地 Mock 資料
- 記一次springboot專案結合arthas排查ClassNotFoundException問題
- 使用Vue.js編寫命令列介面,前端開發CLI的利器
- 升級Spring Cloud最新版後,有個重要的元件被棄用了!
- 微服務架構的通訊設計模式
- 視覺化拖拽元件庫一些技術要點原理分析(四)
- 我做了一個線上白板(二)
- 3 款非常實用的 Node.js 版本管理工具
- 636. 函式的獨佔時間 : 簡單棧運用模擬題
- Flutter 的 6 個最有用的 VS Code擴充套件
- TCP 學習筆記(三) 可靠傳輸
- 一文讀懂微服務架構的分解設計
- Python中常用最神祕的函式! lambda 函式深度總結!
- 從-99打造Sentinel高可用叢集限流中介軟體
- 技術分享| 小程式實現音影片通話
- Birdseye 極其強大的Python除錯工具