Shell變數測試與內容置換

2020-07-16 10:04:40
在指令碼中,有時需要判斷變數是否存在或是否被賦予了值,如果變數已經存在並且被賦予了值,則不改變變數;如果變數不存在或沒有被賦值,則賦予其新值。這時我們就可以使用變數測試與內容置換。

我們在指令碼中可以使用條件判斷語句 if 來替代這種測試方法,不過使用 Shell 自帶的變數置換更加方便,但是這種方法容易記混,我們通過表 1 來進行說明。

表 1 變數測試與內容置換
變數置換方式 變數y沒有設定 變數y為空值 變數y設定值
x=${y-新值} x= 新值 x 為空 x=$y
x=${y:-新值} x= 新值 x= 新值 x=$y
x=${y+新值} x 為空 x= 新值 x=新值
x=${y:+新值} x 為空 x 為空 x=新值
x=${y=新值} x= 新值 x 為空 x=$y
y= 新值 y 值不變 y值不變
x=${y:=新值} x= 新值 X= 新值 x=$y
y= 新值 y= 新值 y值不變
x=${y?新值} 新值輸出到標準錯誤輸出(螢幕) x 為空 x=$y
x=${y:?新值} 新值輸出到標準錯誤輸出 新值輸出到標準錯誤輸出 x=$y

如果大括號內沒有":",則變數 y 為空或沒有被設定,處理方法是不同的;如果大括號內有":",則變數 y 不論是為空,還是沒有被設定,處理方法是一樣的。

如果大括號內是"-"或"+",則在改變變數 x 的值的時候,變數 y 的值是不改變的;如果大括號內是"=",則在改變變數 x 的值的同時,變數 y 的值也會改變。

如果大括號內是"?",則當變數 y 不存在或為空時,會把"新值"當成報錯輸出到螢幕上。

【例 1】

[[email protected] ~]# unset y
#刪除變數y
[[email protected] ~]# x=${y-new}
#進行測試
[[email protected] ~]# echo $x
new
#因為變數y不存在,所以x=new
[[email protected] ~]# echo $y
#變數y還是不存在的

和表 1 對比一下,是不是可以看懂了?這是變數 y 不存在的情況,如果變數 y 為空呢?

[[email protected] ~]#y=""
#給變數y賦值為空
[[email protected] ~]#x=${y-new}
#進行測試
[[email protected] ~]# echo $x
[[email protected] ~]# echo $y
#變數x和y都為空
如果變數y有值呢?
[[email protected] ~]#y=old
#給變數y賦值
[[email protected] ~]# x=${y-new}
#進行測試
[[email protected] ~]# echo $x
old
[[email protected] ~]# echo $y
old
#變數x和y的值都是old


【例2】
如果大括號內是"=",則又是什麼情況呢?先測試一下變數 y 沒有被設定的情況,如下:

[[email protected] ~]# unset y
#刪除變數y
[[email protected] ~]# x=${y:=new}
#進行測試
[[email protected] ~]# echo $x
new
[[email protected] ~]# echo $y
new
#變數x和y的值都是new

一旦使用了"=",那麼會同時處理變數 x 和 y,而不像例 1 那樣只改變變數 x 的值。如果變數 y 為空,則又是什麼情況呢?

[[email protected] ~]#y=""
#設定變數y為空
[[email protected] ~]#x=${y:=new}
#進行測試
[[email protected] ~]# echo $x
new
[[email protected] ~]# echo $y
new
#變數x和y的值都是new

一旦在大括號中使用":",那麼變數 y 為空或者沒有被設定,處理方法是一樣的。如果變數 y 已經被賦值 了,則又是什麼情況?

[[email protected] ~]# y=old
#給變數y賦值
[[email protected] ~]#x=${y:=new}
#進行測試
[[email protected] ~]# echo $x
old
[[email protected] ~]# echo $y
old
#變數x和y的值都是old


【例3】
再測試一下大括號中是"?"的情況。

[[email protected] ~]# unset y
#刪除變數y
[[email protected] ~]#x=${y?new}
-bash: y: new
#會把值"new"輸出到螢幕上

如果變數 y 已經被賦值了呢?

[[email protected] ~]# y=old
#給變數y賦值
[[email protected]@localhost ~]# x=${y?new}
#進行測試
[[email protected] ~]# echo $x
old
[[email protected] ~]# echo $y
old
#變數x和y的值都是old

這些內容實在讓人頭疼啊,如果在指令碼中用到了,則參考表 1 即可。