1. 程式人生 > >Linux變量內容的刪除、代替與替換

Linux變量內容的刪除、代替與替換

方法 class 5% == lin 名稱 popu ber 想要

變量內容的刪除與代替

範例一:先讓小寫的 path 自己定義變量配置的與 PATH 內容同樣
[[email protected] ~]# path=${PATH}
[[email protected] ~]# echo $path
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:
/usr/sbin:/usr/bin:/root/bin  <==這兩行事實上是同一行啦!

範例二:如果我不喜歡 kerberos,所以要將前兩個文件夾刪除掉,怎樣顯示?
[[email protected]
/* */ ~]# echo ${path#/*kerberos/bin:} /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin


${variable#/*kerberos/bin:}
   上面的特殊字體部分是關鍵詞!

用在這樣的刪除模式所必須存在的 ${variable#/*kerberos/bin:} 這就是原本的變量名稱。以上面範例二來說,這裏就填寫 path 這個『變量名稱』啦! ${variable#/*kerberos/bin:} 這是重點。代表『從變量內容的最前面開始向右刪除』。且僅刪除最短的那個

${variable#/*kerberos/bin:} 代表要被刪除的部分。因為 # 代表由前面開始刪除,所以這裏便由開始的 / 寫起。 須要註意的是,我們還能夠透過通配符 * 來代替 0 到無窮多個隨意字符 以上面範例二的結果來看, path 這個變量被刪除的內容例如以下所看到的: /usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin: /usr/sbin:/usr/bin:/root/bin <==這兩行事實上是同一行啦!

範例三:我想要刪除前面全部的文件夾,僅保留最後一個文件夾
[[email protected] ~]# echo ${path#/*:} /usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin: /root/bin <==這兩行事實上是同一行啦! # 因為一個 # 僅刪除掉最短的那個,因此他刪除的情況能夠用底下的刪除線來看: # /usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin: # /usr/sbin:/usr/bin:/root/bin <==這兩行事實上是同一行啦。 [[email protected] ~]# echo ${path##/*:} /root/bin # 嘿!

多加了一個 # 變成 ## 之後。他變成『刪除掉最長的那個數據』。亦即是: # /usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin: # /usr/sbin:/usr/bin:/root/bin <==這兩行事實上是同一行啦!


由於在 PATH 這個變量的內容中。每一個文件夾都是以冒號『:』隔開的, 所以要從頭刪除掉文件夾就是介於斜線 (/) 到冒號 (:) 之間的數據。可是 PATH 中不止一個冒號 (:) 啊。 所以 # 與 ## 就分別代表:

# :符合代替文字的『最短的』那一個;
##:符合代替文字的『最長的』那一個

範例四:我想要刪除最後面那個文件夾,亦即從 : 到 bin 為止的字符串
[[email protected] ~]# echo ${path%:*bin}
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:
/usr/sbin:/usr/bin  <==註意啊。最後面一個文件夾不見去!
# 這個 % 符號代表由最後面開始向前刪除!所以上面得到的結果事實上是來自例如以下:
# /usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:
# /usr/sbin:/usr/bin:/root/bin  <==這兩行事實上是同一行啦!

範例五:那假設我僅僅想要保留第一個文件夾呢?
[[email protected] ~]# echo ${path%%:*bin}
/usr/kerberos/sbin
# 相同的, %% 代表的則是最長的符合字符串,所以結果事實上是來自例如以下:
# /usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:
# /usr/sbin:/usr/bin:/root/bin  <==這兩行事實上是同一行啦!



範例六:將 path 的變量內容內的 sbin 代替成大寫 SBIN:
[[email protected] ~]# echo ${path/sbin/SBIN}
/usr/kerberos/SBIN:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:
/usr/sbin:/usr/bin:/root/bin
# 這個部分就easy理解的多了。關鍵詞在於那兩個斜線,兩斜線中間的是舊字符串
# 後面的是新字符串。所以結果就會出現如上述的特殊字體部分啰!

[[email protected] ~]# echo ${path//sbin/SBIN} /usr/kerberos/SBIN:/usr/kerberos/bin:/usr/local/SBIN:/usr/local/bin:/SBIN:/bin: /usr/SBIN:/usr/bin:/root/bin # 假設是兩條斜線,那麽就變成全部符合的內容都會被代替喔。


總結

變量配置方式 說明
${變量#關鍵詞}
${
變量##關鍵詞}
若變量內容從頭開始的數據符合『關鍵詞』,則將符合的最短數據刪除
若變量內容從頭開始的數據符合『關鍵詞』,則將符合的最長數據刪除
${變量%關鍵詞}
${
變量%%關鍵詞}
若變量內容從尾向前的數據符合『關鍵詞』,則將符合的最短數據刪除
若變量內容從尾向前的數據符合『關鍵詞』。則將符合的最長數據刪除
${變量/舊字符串/新字符串}
${
變量//舊字符串/新字符串}
若變量內容符合『舊字符串』則『第一個舊字符串會被新字符串代替』
若變量內容符合『舊字符串』則『所有的舊字符串會被新字符串代替』

變量的測試與內容替換

在某些時刻我們經常須要『推斷』某個變量是否存在,若變量存在則使用既有的配置,若變量不存在則給予一個經常使用的配置。


範例一:測試一下是否存在 username 這個變量。若不存在則給予 username 內容為 root
[[email protected] ~]# echo $username
           <==由於出現空白,所以 username 可能不存在。也可能是空字符串
[[email protected] ~]# username=${username-root}
[[email protected] ~]# echo $username
root       <==由於 username 沒有配置,所以主動給予名為 root 的內容。

[[email protected] ~]# username="vbird tsai" <==主動配置 username 的內容 [[email protected] ~]# username=${username-root} [[email protected] ~]# echo $username vbird tsai <==由於 username 已經配置了,所以使用舊有的配置而不以 root 代替


new_var=${old_var-content}
   新的變量,主要用來代替舊變量。

新舊變量名稱事實上經常是一樣的 new_var=${old_var-content} 這是本範例中的關鍵詞部分!必需要存在的哩! new_var=${old_var-content} 舊的變量。被測試的項目! new_var=${old_var-content} 變量的『內容』,在本範例中。這個部分是在『給予未配置變量的內容』


範例二:若 username 未配置或為空字符串。則將 username 內容配置為 root
[[email protected] ~]# username=""
[[email protected] ~]# username=${username-root}
[[email protected] ~]# echo $username
      <==由於 username 被配置為空字符串了!

所以當然還是保留為空字符串。 [[email protected] ~]# username=${username:-root} [[email protected] ~]# echo $username root <==加上『 : 』後若變量內容為空或者是未配置。都可以以後面的內容替換!


在大括號內有沒有冒號『 : 』的區別是非常大的!加上冒號後,被測試的變量未被配置或者是已被配置為空字符串時, 都可以用後面的內容 (本例中是使用 root 為內容) 來替換與配置!

這樣可以了解了嗎?除了這種測試之外, 還有其它的測試方法。

變量配置方式 str 沒有配置 str 為空字符串 str 已配置非為空字符串
var=${str-expr} var=expr var= var=$str
var=${str:-expr} var=expr var=expr var=$str
var=${str+expr} var= var=expr var=expr
var=${str:+expr} var= 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

測試:先如果 str 不存在 (用 unset) ,然後測試一下減號 (-) 的使用方法:
[[email protected] ~]# unset str; var=${str-newvar}
[[email protected] ~]# echo var="$var", str="$str"
var=newvar, str=        <==由於 str 不存在。所以 var 為 newvar

測試:若 str 已存在,測試一下 var 會變如何?:
[[email protected] ~]# str="oldvar"; var=${str-newvar}
[[email protected] ~]# echo var="$var", str="$str"
var=oldvar, str=oldvar  <==由於 str 存在,所以 var 等於 str 的內容


測試:先如果 str 不存在 (用 unset) ,然後測試一下等號 (=) 的使用方法:
[[email protected] ~]# unset str; var=${str=newvar}
[[email protected] ~]# echo var="$var", str="$str"
var=newvar, str=newvar  <==由於 str 不存在,所以 var/str 均為 newvar

測試:如果 str 已存在了。測試一下 var 會變如何?
[[email protected] ~]# str="oldvar"; var=${str=newvar}
[[email protected] ~]# echo var="$var", str="$str"
var=oldvar, str=oldvar  <==由於 str 存在,所以 var 等於 str 的內容


測試:若 str 不存在時。則 var 的測試結果直接顯示 "無此變量"
[[email protected] ~]# unset str; var=${str?

無此變量} -bash: str: 無此變量 <==由於 str 不存在,所以輸出錯誤信息 測試:若 str 存在時,則 var 的內容會與 str 同樣! [[email protected] ~]# str="oldvar"; var=${str?novar} [[email protected] ~]# echo var="$var", str="$str" var=oldvar, str=oldvar <==由於 str 存在,所以 var 等於 str 的內容


Linux變量內容的刪除、代替與替換