10.2.8 變數內容的刪除、取代與替換 (Optional)

變數除了可以直接設定來修改原本的內容之外,有沒有辦法透過簡單的動作來將變數的內容進行微調呢? 舉例來說,進行變數內容的刪除、取代與替換等!是可以的!我們可以透過幾個簡單的小步驟來進行變數內容的微調喔! 底下就來試試看!

  • 變數內容的刪除與取代

變數的內容可以很簡單的透過幾個咚咚來進行刪除喔!我們使用 PATH 這個變數的內容來做測試好了。 請你依序進行底下的幾個例子來玩玩,比較容易感受的到鳥哥在這裡想要表達的意義:

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。
範例一:先讓小寫的 path 自訂變數設定的與 PATH 內容相同
[dmtsai@study ~]$ path=${PATH} [dmtsai@study ~]$ echo ${path} /usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/dmtsai/.local/bin:/home/dmtsai/bin 範例二:假設我不喜歡 local/bin,所以要將前 1 個目錄刪除掉,如何顯示? [dmtsai@study ~]$ echo ${path#/*local/bin:} /usr/bin:/usr/local/sbin:/usr/sbin:/home/dmtsai/.local/bin:/home/dmtsai/bin 

上面這個範例很有趣的!他的重點可以用底下這張表格來說明:

${variable#/*local/bin:}  上面的特殊字體部分是關鍵字!用在這種刪除模式所必須存在的 ${variable#/*local/bin:}  這就是原本的變數名稱,以上面範例二來說,這裡就填寫 path 這個『變數名稱』啦! ${variable#/*local/bin:}  這是重點!代表『從變數內容的最前面開始向右刪除』,且僅刪除最短的那個 ${variable#/*local/bin:}  代表要被刪除的部分,由於 # 代表由前面開始刪除,所以這裡便由開始的 / 寫起。 需要注意的是,我們還可以透過萬用字元 * 來取代 0 到無窮多個任意字元  以上面範例二的結果來看, path 這個變數被刪除的內容如下所示: /usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/dmtsai/.local/bin:/home/dmtsai/bin 

很有趣吧!這樣瞭解了 # 的功能了嗎?接下來讓我們來看看底下的範例三!

範例三:我想要刪除前面所有的目錄,僅保留最後一個目錄
[dmtsai@study ~]$ echo ${path#/*:} /usr/bin:/usr/local/sbin:/usr/sbin:/home/dmtsai/.local/bin:/home/dmtsai/bin # 由於一個 # 僅刪除掉最短的那個,因此他刪除的情況可以用底下的刪除線來看: # /usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/dmtsai/.local/bin:/home/dmtsai/bin [dmtsai@study ~]$ echo ${path##/*:} /home/dmtsai/bin # 嘿!多加了一個 # 變成 ## 之後,他變成『刪除掉最長的那個資料』!亦即是: # /usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/dmtsai/.local/bin:/home/dmtsai/bin 

非常有趣!不是嗎?因為在 PATH 這個變數的內容中,每個目錄都是以冒號『:』隔開的, 所以要從頭刪除掉目錄就是介於斜線 (/) 到冒號 (:) 之間的資料!但是 PATH 中不止一個冒號 (:) 啊! 所以 # 與 ## 就分別代表:

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

上面談到的是『從前面開始刪除變數內容』,那麼如果想要『從後面向前刪除變數內容』呢? 這個時候就得使用百分比 (%) 符號了!來看看範例四怎麼做吧!

範例四:我想要刪除最後面那個目錄,亦即從 : 到 bin 為止的字串
[dmtsai@study ~]$ echo ${path%:*bin} /usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/dmtsai/.local/bin # 注意啊!最後面一個目錄不見去! # 這個 % 符號代表由最後面開始向前刪除!所以上面得到的結果其實是來自如下: # /usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/dmtsai/.local/bin:/home/dmtsai/bin 範例五:那如果我只想要保留第一個目錄呢? [dmtsai@study ~]$ echo ${path%%:*bin} /usr/local/bin # 同樣的, %% 代表的則是最長的符合字串,所以結果其實是來自如下: # /usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/dmtsai/.local/bin:/home/dmtsai/bin 

由於我是想要由變數內容的後面向前面刪除,而我這個變數內容最後面的結尾是『/home/dmtsai/bin』, 所以你可以看到上面我刪除的資料最終一定是『bin』,亦即是『:*bin』那個 * 代表萬用字元! 至於 % 與 %% 的意義其實與 # 及 ## 類似!這樣理解否?

例題: 假設你是 dmtsai ,那你的 MAIL 變數應該是 /var/spool/mail/dmtsai 。假設你只想要保留最後面那個檔名 (dmtsai), 前面的目錄名稱都不要了,如何利用 $MAIL 變數來達成? 答: 題意其實是這樣『/var/spool/mail/dmtsai』,亦即刪除掉兩條斜線間的所有資料(最長符合)。 這個時候你就可以這樣做即可:
[dmtsai@study ~]$ echo ${MAIL##/*/}
相反的,如果你只想要拿掉檔名,保留目錄的名稱,亦即是『/var/spool/mail/dmtsai』 (最短符合)。但假設你並不知道結尾的字母為何,此時你可以利用萬用字元來處理即可,如下所示:
[dmtsai@study ~]$ echo ${MAIL%/*}

瞭解了刪除功能後,接下來談談取代吧!繼續玩玩範例六囉!

範例六:將 path 的變數內容內的 sbin 取代成大寫 SBIN:
[dmtsai@study ~]$ echo ${path/sbin/SBIN} /usr/local/bin:/usr/bin:/usr/local/SBIN:/usr/sbin:/home/dmtsai/.local/bin:/home/dmtsai/bin # 這個部分就容易理解的多了!關鍵字在於那兩個斜線,兩斜線中間的是舊字串 # 後面的是新字串,所以結果就會出現如上述的特殊字體部分囉! [dmtsai@study ~]$ echo ${path//sbin/SBIN} /usr/local/bin:/usr/bin:/usr/local/SBIN:/usr/SBIN:/home/dmtsai/.local/bin:/home/dmtsai/bin # 如果是兩條斜線,那麼就變成所有符合的內容都會被取代喔! 

我們將這部份作個總結說明一下:

變數設定方式 說明
${變數#關鍵字}
${變數##關鍵字}
若變數內容從頭開始的資料符合『關鍵字』,則將符合的最短資料刪除
若變數內容從頭開始的資料符合『關鍵字』,則將符合的最長資料刪除
${變數%關鍵字}
${變數%%關鍵字}
若變數內容從尾向前的資料符合『關鍵字』,則將符合的最短資料刪除
若變數內容從尾向前的資料符合『關鍵字』,則將符合的最長資料刪除
${變數/舊字串/新字串}
${變數//舊字串/新字串}
若變數內容符合『舊字串』則『第一個舊字串會被新字串取代』
若變數內容符合『舊字串』則『全部的舊字串會被新字串取代』
扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄