linux變數內容的刪除和替換

2021-09-16 12:31:41 字數 1867 閱讀 9511

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 ...