在shell中經(jīng)常要對變量進行字符串的截取操作歪脏,雖然截取字符串的方法很多喷斋,在這里用${}的方法操作變量應(yīng)該是最簡潔的方式。
1. 最小匹配和最大匹配
shell腳本中經(jīng)常要對輸入的參數(shù)截取其路徑或文件名蚯姆,例如變量file中保存著輸入?yún)?shù):
file=/home/user/file1.txt
表達式 | 作用 | 結(jié)果 |
---|---|---|
${file#*/} | 刪掉第一個 “/” 及其左邊的字符串 | home/user/file1.txt |
${file##*/} | 刪掉最后一個 “/” 及其左邊的字符串 | file1.txt |
${file%/*} | 刪掉最后一個 “/” 及其右邊的字符串 | /home/user |
${file%%/*} | 刪掉第一個 “/” 及其右邊的字符串 | (空值) |
${file#*.} | 刪掉第一個 “.” 及其左邊的字符串 | txt |
${file##*.} | 刪掉最后一個 “.” 及其左邊的字符串 | txt |
${file%.*} | 刪掉最后一個 “.” 及其右邊的字符串 | /home/user/file1 |
${file%%.*} | 刪掉第一個 “.” 及其右邊的字符串 | /home/user/file1 |
這里的最大匹配和最小匹配與正則表達式是不是很像元咙,但是用起來簡單方便。
如果覺得不方便記憶湃密,可以這樣來看:
鍵盤上#诅挑、 $、%分別對應(yīng)著3泛源、4拔妥、5
- # 是 去掉左邊(鍵盤上#在 $ 的左邊)
- %是去掉右邊(鍵盤上% 在$ 的右邊)
- 一個符號是最小匹配;兩個符號是最大匹配
因此达箍,#/就是以"/"為末尾字符的最小匹配(從左到右)没龙,%/就是以"/"為開頭字符的最小匹配(從右到左)。
2. 按長度截取字符串
仍然對上面的file變量進行操作缎玫,注意字符的位置從0開始
表達式 | 作用 | 結(jié)果 |
---|---|---|
${file:0:5} | 截取最左邊的 5 個字符 | /home |
${file:1:5} | 截取從第2個字符開始的5個字符 | home/ |
${file:5:5} | 截取從第6個字符開始的5個字符 | /user |
3. 字符串替換
表達式 | 作用 | 結(jié)果 |
---|---|---|
${file/e/o} | 把變量中第一個字符"e"替換為字符"o" | /homo/user/file1.txt |
${file//e/o} | 把變量中全部字符"e"替換為字符"o" | /homo/usor/filo1.txt |
4.根據(jù)變量的賦值狀態(tài)重新賦值
利用 ${ } 還可針對不同的變量賦值狀態(tài)(未賦值硬纤、空值、非空值)返回不同的結(jié)果:
表達式 | 作用 |
---|---|
${file-/home} | 假如 $file 沒有賦值赃磨,則使用 /home 作傳回值筝家。($file為空值及非空值時返回變量本身) |
${file:-/home} | 假如 $file 沒有賦值或為空值,則使用 /home 作傳回值邻辉。 ($file非空值時返回變量本身) |
${file+/home} | 假如 $file 有賦值(空值或非空值)溪王,則都使用 /home 作傳回值。($file沒有賦值則不作處理) |
${file:+/home} | 假如 $file 為非空值值骇,則使用 /home 作傳回值莹菱。 ($file沒有賦值或為空值均不作處理) |
${file=/home} | 假如 $file 沒有賦值,則使用 /home 作傳回值吱瘩,同時將$file賦值為/home道伟。(空值及非空值時不作處理) |
${file:=/home} | 假如 $file 沒有賦值或為空值,則使用 /home 作傳回值使碾,同時將$file賦值為/home蜜徽。(非空值時不作處理) |
${file?/home} | 假如 $file 沒有賦值祝懂,則將 /home 輸出至 STDERR,也就是一條包含/home內(nèi)容的錯誤信息娜汁。(空值及非空值時不作處理) |
${file:?/home} | 假如 $file 沒有賦值或為空值嫂易,則將 /home 輸出至 STDERR,(非空值時不作處理) |
${#file} | 返回 $file 變量字符串的長度 |