shell指令碼程式設計學習筆記——變數

語言: CN / TW / HK

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 命令不能刪除只讀變數。