shell內建了對變數進行刪除和替換的功能,非常的方便。雖然平時用的機會非常少,但是閱讀別人寫的指令碼時,會經常遇到。
所以進行乙個學習總結。
$ 從變數頭部開始匹配模式,將符合的最短資料刪除
$ 從變數頭部開始匹配模式,將符合的最長資料刪除
$ 從變數尾部開始匹配模式,將符合的最短資料刪除
$ 從變數尾部開始匹配模式,將符合的最長資料刪除
$ 將第乙個符合舊模式的資料替換為新模式
$ 將全部符合舊模式的資料替換為新模式
#和%是刪除符號。在鍵盤上,#號在$的左邊,所以是從左邊開始刪除,%在$符的右邊,所以是從右邊開始刪除。
/是替換符。
最常用的場景:
1.輸出檔案的字尾
例如要判斷檔案的字尾名
var1=me.txt
echo $
txt用#會匹配上第乙個點和之前的內容,刪除掉之後就獲得了字尾名txt。
var=me.pdf.txt
echo $
txt假如檔名中本身含有點就會讓上一種寫法失效,此時應該用##來匹配最長資料。
2.輸出檔名
類似上面的例子,這次是要輸出檔名
echo $
me可見,%刪除了從右邊起第乙個點及其右邊的字元,剩下的就是檔名了。
echo $
me.pdf
假如檔名中本身含有點也是會讓上一種寫法失效,此時用%來做最短匹配就行了。
3.替換部分字元
var=hello123hello123
echo $
hello456hello123
echo $
hello456hello456
可以看到第乙個操作將首個123替換為456,第二個操作將所有123都變為456。
個人理解,shell只支援*號這個萬用字元,有匹配最短和最長資料這兩種模式,沒有完整的正規表示式支援。
在網上看到這樣一段指令碼:
##ipv4 or ipv6
tempip="***x"
if [ "$tempip" != "$" ]
then
##ipv4
else
##ipv6
fi
其作用是判斷是ipv4位址還是ipv6位址。
其原理就是刪除匹配這個規律的部分:開始任意個任意字元+1個數字+點號+1個數字
所以ipv4位址肯定能夠匹配上。但是ipv6位址由於不包含點 號所以匹配不上。
root@debian2:~#
root@debian2:~# tempip="192.168.0.103"
root@debian2:~#
root@debian2:~# echo $
68.0.103
root@debian2:~#
root@debian2:~#
root@debian2:~# tempipv6="::1"
root@debian2:~#
root@debian2:~# echo $
::1root@debian2:~#
但是,這個沒有考慮到一種情況,就是ipv6相容位址中,其實是含有點號的。
更簡單的方法是判斷ip位址中是否包含冒號。
##ipv4 or ipv6
tempip="***x"
echo $tempip | grep -q ":"
result=$?
if [ "$result" -eq 0 ]
then
##ipv6
else
##ipv4
fi
參考: shell 變數內容刪除 替換
鳥哥例項練習 變數設定方式說明 若變數內容從頭開始的資料符合 關鍵字 則將符合的最短資料刪除 若變數內容從頭開始的資料符合 關鍵字 則將符合的最短資料刪除 若變數內容從尾向前的資料符合 關鍵字 則將符合的最短資料刪除 若變數內容從尾向前的資料符合 關鍵字 則將符合的最長資料刪除 若變數內容符合 舊字...
linux變數內容的刪除與替代
bash 對 定義了不少用法。對變數的操作及判斷是乙個十分有用的工具,應好好學習一下,以下是說明的表列 變數的刪除 變數的提取 變數的替換 變數的刪除 提取 替換 file dir1 dir2 dir3 my.file.txt 定義乙個變數 echo file 顯示定義的變數 dir1 dir2 d...
變數的測試與內容替換
在某些時刻我們常常需要 判斷 某個變數是否存在,若變數存在則使用既有的配置,若變數不存在則給予乙個常用的配置。我們舉底下的例子來說明好了,看看能不能較容易被你所理解呢!範例一 測試一下是否存在 username 這個變數,若不存在則給予 username 內容為 root root sor sys ...