linux中$符号的常用法

来源:互联网 发布:开淘宝赚不到钱 编辑:程序博客网 时间:2024/06/05 22:54

转自: http://linux.vbird.org/
剛剛我們提到了兩種變數取用的方法,分別是這樣:
[root@linux ~]# echo $HOME[root@linux ~]# echo ${HOME}
那麼,在那個 ${variable} 的使用方法中,其實,我們還可以將變數進行一些修訂的工作喔! 只要加上一些字符標誌,後面再接著使用比對字串,就能夠修改變數的內容了! 我們取底下的例子來說明:在底下的例子中,假設我的變數名稱為 vbird ,且內容為 /home/vbird/testing/testing.x.sh。
1. 完整呈現 vbird 這個變數的內容;[root@linux ~]# vbird="/home/vbird/testing/testing.x.sh"[root@linux ~]# echo ${vbird}/home/vbird/testing/testing.x.sh2. 在 vbird 變數中,從最前面開始比對,若開頭為 / ,則刪除兩個 /    之間的所有資料,亦即 /*/[root@linux ~]# echo ${vbird##/*/}testing.x.sh    <==刪除了 /home/vbird/testing/[root@linux ~]# echo ${vbird#/*/}vbird/testing/testing.x.sh   <==僅刪除 /home/ 而已# 這兩個小例子有趣了~變數名稱後面如果接了兩個 ## ,表示在 ### 後面的字串取『最長的』那一段;如果僅有一個 # ,表示取『最小的那一段』喔!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 這個變數的內容最後面是 h 而不是 / 啊!# 至於 %%/* 則是刪除『最長的那個 /* 』,當然就是全部喔!而 %/* 則是最短的那個!4. 將 vbird 變數中的 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# 如果變數後面接的是 / 時,那麼表示後面是進行『取代』的工作~而且僅取代『第一個』# 但如果是 // ,則表示全部的字串都取代啊!
這裡您稍微留意一下就好了~反正就是變數後面可以接 #, ##, %, %%, /, // , 而他們存在的意義並不相同的啦~

另外,幾個不同的變數內容還可以進行判斷呢! 舉例來說,目前我需要用到兩個變數,分別是 var 與 str , 那我想要針對 str 這個變數內容是否有設定成一個字串,亦即 "expr" 來決定 var 的內容。 那我可以使用什麼方法來進行判斷呢?如果您會寫 shell script 的話, 直接用 shell script 就好了,如果不會寫,那麼我們就透過簡單的變數判斷吧!
Tips:
底下的例子當中,那個 var 與 str 為變數,我們想要針對 str 是否有設定來決定 var 的值喔! 一般來說, str: 代表『str 沒設定或為空的字串時』;至於 str 則僅為『沒有該變數』。鳥哥的圖示
變數設定方式str 沒有設定str 為空字串str 已設定非為空字串var=${str-expr}var=exprvar=var=$strvar=${str:-expr}var=exprvar=exprvar=$strvar=${str+expr}var=var=exprvar=exprvar=${str:+expr}var=var=var=exprvar=${str=expr}str=expr
var=exprstr 不變
var=str 不變
var=$strvar=${str:=expr}str=expr
var=exprstr=expr
var=exprstr 不變
var=$strvar=${str?expr}expr 輸出至 stderrvar=var=strvar=${str:?expr}expr 輸出至 stderrexpr 輸出至 stderrvar=str
根據上面這張表,我們來進行幾個範例的練習吧! ^_^
範例一:若 str 這個變數內容存在,則 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 的內容範例二:若 str 不存在,則 var 與 str 均設定為 newvar,否則 var 與 str 相同[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 的內容範例三:若 str 這個變數存在,則 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 的內容# 上面這三個案例都沒有提到當 str 有設定,且為空字串的情況喔!# 您可以自行測試一下哩!
雖然猛一看,覺得變數沒有什麼奇特的地方,但是,如果仔細瞧一瞧,嘿!一堆環境變數與系統資源方面的變數, 可是會影響到我們在 bash 裡頭是否能夠順利作業的呢!例如 PATH 啊、ulimit 之類的~ 所以,您還是得要瞭解變數這個玩意才行喔! ^_^

原创粉丝点击