兩種變數(shù)取用的方法,分別是這樣:

[root@linux ~]# echo $HOME

[root@linux ~]# echo ${HOME}

那么,在那個 ${variable} 的使用方法中,其實,我們還可以將變數(shù)進行一些修訂的工作喔! 只要加上一些字符標志,后面再接著使用比對字串,就能夠修改變數(shù)的內(nèi)容了!我們?nèi)〉紫碌睦觼碚f明:在底下的例子中,假設我的變數(shù)名稱為 vbird ,且內(nèi)容為 /home/vbird/testing/testing.x.sh。

1. 完整呈現(xiàn) vbird 這個變數(shù)的內(nèi)容;

[root@linux ~]# vbird="/home/vbird/testing/testing.x.sh"

[root@linux ~]# echo ${vbird}

/home/vbird/testing/testing.x.sh

2. 在 vbird 變數(shù)中,從最前面開始比對,若開頭為 / ,則刪除兩個 /

   之間的所有資料,亦即 /*/

[root@linux ~]# echo ${vbird##/*/}

testing.x.sh    <==刪除了 /home/vbird/testing/

[root@linux ~]# echo ${vbird#/*/}

vbird/testing/testing.x.sh   <==僅刪除 /home/ 而已

# 這兩個小例子有趣了~變數(shù)名稱后面如果接了兩個 ## ,表示在 ##

# 后面的字串取‘最長的’那一段;如果僅有一個 # ,表示取‘最小的那一段’喔!

3. 呈上題,如果是從后面開始,刪除 /* 呢?

[root@linux ~]# echo ${vbird%%/*/}

/home/vbird/testing/testing.x.sh <==都沒被刪除

[root@linux ~]# echo ${vbird%%/*}

    <==被刪除光了!

[root@linux ~]# echo ${vbird%/*}

/home/vbird/testing   <==只刪除 /testing.x.sh 部分

# 這個例子當中需要特別注意,那個 % 比對的是‘最后面那個字元’的意思,

# 所以啰,第一個方式當然不對~因為 vbird 這個變數(shù)的內(nèi)容最后面是 h 而不是 / 啊!

# 至于 %%/* 則是刪除‘最長的那個 /* ’,當然就是全部喔!而 %/* 則是最短的那個!

4. 將 vbird 變數(shù)中的 testing 取代為 TEST

[root@linux ~]# echo ${vbird/testing/TEST}

/home/vbird/TEST/testing.x.sh

[root@linux ~]# echo ${vbird//testing/TEST}

/home/vbird/TEST/TEST.x.sh

# 如果變數(shù)后面接的是 / 時,那么表示后面是進行‘取代’的工作~而且僅取代‘第一個’

# 但如果是 // ,則表示全部的字串都取代??!

這里您稍微留意一下就好了~反正就是變數(shù)后面可以接 #, ##, %, %%, /, // , 而他們存在的意義并不相同的啦~

另外,幾個不同的變數(shù)內(nèi)容還可以進行判斷呢! 舉例來說,目前我需要用到兩個變數(shù),分別是 var 與 str , 那我想要針對 str 這個變數(shù)內(nèi)容是否有設定成一個字串,亦即 "expr" 來決定 var 的內(nèi)容。 那我可以使用什么方法來進行判斷呢?如果您會寫 shell script 的話, 直接用 shell script 就好了,如果不會寫,那么我們就透過簡單的變數(shù)判斷吧!

Tips:
底下的例子當中,那個 var 與 str 為變數(shù),我們想要針對 str 是否有設定來決定 var 的值喔! 一般來說, str: 代表‘str 沒設定或為空的字串時’;至于 str 則僅為‘沒有該變數(shù)’。


變數(shù)設定方式

str 沒有設定

str 為空字串

str 已設定非為空字串

var=${str-expr}

var=expr

var=

var=$str

var=${str:-expr}

var=expr

var=expr

var=$str

var=${str+expr}

var=expr

var=expr

var=expr

var=${str:+expr}

var=expr

var=

var=expr

var=${str=expr}

str=expr
var=expr

str 不變
var=

str 不變
var=$str

var=${str:=expr}

str=expr
var=expr

str=expr
var=expr

str 不變
var=$str

var=${str?expr}

expr 輸出至 stderr

var=

var=str

var=${str:?expr}

expr 輸出至 stderr

expr 輸出至 stderr

var=str


根據(jù)上面這張表,我們來進行幾個范例的練習吧! ^_^

范例一:若 str 這個變數(shù)內(nèi)容存在,則 var 設定為 str ,否則 var 設定為 "newvar"

[root@linux ~]# unset str; var=${str-newvar}

[root@linux ~]# echo var="$var", str="$str"

var=newvar, str=        <==因為 str 不存在,所以 var 為 newvar

[root@linux ~]# str="oldvar"; var=${str-newvar}

[root@linux ~]# echo var="$var", str="$str"

var=oldvar, str=oldvar <==因為 str 存在,所以 var 等于 str 的內(nèi)容

范例二:若 str 不存在,則 var 與 str 均設定為 newvar,否則僅 var 為 newvar

[root@linux ~]# unset str; var=${str=newvar}

[root@linux ~]# echo var="$var", str="$str"

var=newvar, str=newvar <==因為 str 不存在,所以 var/str 均為 newvar

[root@linux ~]# str="oldvar"; var=${str=newvar}

[root@linux ~]# echo var="$var", str="$str"

var=oldvar, str=oldvar <==因為 str 存在,所以 var 等于 str 的內(nèi)容

范例三:若 str 這個變數(shù)存在,則 var 等于 str ,否則輸出 "novar"

[root@linux ~]# unset str; var=${str?novar}

-bash: str: novar       <==因為 str 不存在,所以輸出錯誤訊息

[root@linux ~]# str="oldvar"; var=${str?novar}

[root@linux ~]# echo var="$var", str="$str"

var=oldvar, str=oldvar <==因為 str 存在,所以 var 等于 str 的內(nèi)容

# 上面這三個案例都沒有提到當 str 有設定,且為空字串的情況喔!

# 您可以自行測試一下哩!

雖然猛一看,覺得變數(shù)沒有什么奇特的地方,但是,如果仔細瞧一瞧,嘿!一堆環(huán)境變數(shù)與系統(tǒng)資源方面的變數(shù), 可是會影響到我們在 bash 里頭是否能夠順利作業(yè)的呢!例如 PATH 啊、ulimit 之類的~ 所以,您還是得要了解變數(shù)這個玩意才行喔! ^_^

使用最多的就是下面兩個

var=${str-expr}:只要有輸入,就使用輸入的值,哪怕輸入為空字符串,否則使用expr的默認值

var=${str:-expr}:只有輸入非空字符串時,才使用輸入值,否則使用expr的默認值