Linux變量內容的刪除、代替與替換
阿新 • • 發佈:2017-07-20
方法 class 5% == lin 名稱 popu ber 想要
由於在 PATH 這個變量的內容中。每一個文件夾都是以冒號『:』隔開的, 所以要從頭刪除掉文件夾就是介於斜線 (/) 到冒號 (:) 之間的數據。可是 PATH 中不止一個冒號 (:) 啊。 所以 # 與 ## 就分別代表:
# :符合代替文字的『最短的』那一個;
##:符合代替文字的『最長的』那一個
總結
在大括號內有沒有冒號『 : 』的區別是非常大的!加上冒號後,被測試的變量未被配置或者是已被配置為空字符串時, 都可以用後面的內容 (本例中是使用 root 為內容) 來替換與配置!
變量內容的刪除與代替
範例一:先讓小寫的 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:} 上面的特殊字體部分是關鍵詞! |
範例三:我想要刪除前面全部的文件夾,僅保留最後一個文件夾 |
# :符合代替文字的『最短的』那一個;
##:符合代替文字的『最長的』那一個
範例四:我想要刪除最後面那個文件夾,亦即從 : 到 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} 新的變量,主要用來代替舊變量。 |
範例二:若 username 未配置或為空字符串。則將 username 內容配置為 root [[email protected] ~]# username="" [[email protected] ~]# username=${username-root} [[email protected] ~]# echo $username <==由於 username 被配置為空字符串了! |
這樣可以了解了嗎?除了這種測試之外, 還有其它的測試方法。
變量配置方式 | 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? |
Linux變量內容的刪除、代替與替換