shell字符串處理
一、字符串切片:
${#var}:返回字符串變量var的長度
${var:offset}:返回字符串變量var中從第offset個字符後(不包括第offset個字符)的字符開始,到最後的部分,offset的取值在0到 ${#var}-1 之間(bash4.2後,允許為負值)
${var:offset:number}:返回字符串變量var中從第offset個字符後(不包括第offset個字符)的字符開始,長度為number的部分
${var: -length}:取字符串的最右側幾個字符,註意:冒號後必須有一空白字符
${var:offset:-length}:從最左側跳過offset字符,一直向右取到距離最右側lengh個字符之前的內容
${var: -length:-offset}:先從最右側向左取到length個字符開始,再向右取到距離最右側offset個字符之間的內容,註意:-length前空格,同樣的表達形式,offset的表現行為和數組的是反著的。
字符串切片實例:
- a=‘abcdefghijklmn‘
- echo ${#a} #輸出字符串a的總長度
- 14
- echo ${a:4} #輸出字符串a從0開始數,包含第4個元素之後的所有元素
- efghijklmn
- echo ${a:4:3} #輸出字符串a從0開始數,包含第4個元素之後的3個元素
- efg
- echo ${a: -4} #從字符串a的右側向左取4個元素,冒號後必須有一個空字符
- klmn
- echo ${a:5:-2} #輸出字符串a從0開始數,包含第5個元素的向右數的i倒數3個元素,註意這種用法依賴bash版本,盡量別用。
- fghijkl
- echo ${a: -5:-2} #從字符串a的右側向左數5個,再向右取到倒數3個字符,註意這種用法依賴bash版本,盡量別用。
- jkl
- echo ${a: -5:2} #從字符串a的右側向左數5個,再向右取2個字符
- jk
二、基於模式取子串
${var#*word}:其中word可以是指定的任意字符功能:自左而右,查找var變量所存儲的字符串中,第一次出現的word, 刪除字符串開頭至第一次出現word字符之間的所有字符
${var##*word}:同上,貪婪模式,不同的是,刪除的是字符串開頭至最後一次由word指定的字符之間的所有內容
${var%word*}:其中word可以是指定的任意字符;功能:自右而左,查找var變量所存儲的字符串中,第一次出現的word, 刪除字符串最後一個字符向左至第一次出現word字符之間的所有字符;
${var%%word*}:同上,只不過刪除字符串最右側的字符向左至最後一次出現word字符之間的所有字符;
字符處理實例:
- a=‘abcdefg_a_fghijklmn‘
- echo ${a#*fg} #從左邊開始刪,刪除起始位置到第一個fg為止,包括fg
- _a_fghijklmn
- echo ${a##*fg} #貪婪模式,左邊開始刪,刪除起始位置到最後一個fg為止,包括fg
- hijklmn
- echo ${a%fg*} #從右邊開始刪,刪除終點位置到第一個fg為止,包括fg
- abcdefg_a_
- echo ${a%%fg*} #貪婪模式,從右邊開始刪,刪除重點位置到最後一個fg為止,包括fg
- abcde
三、字符串的查找替換
${var/pattern/substr}:查找var所表示的字符串中,第一次被pattern所匹配到的字符串,以substr替換之
${var//pattern/substr}: 查找var所表示的字符串中,所有能被pattern所匹配到的字符串,以substr替換之
${var/#pattern/substr}:查找var所表示的字符串中,行首被pattern所匹配到的字符串,以substr替換之
${var/%pattern/substr}:查找var所表示的字符串中,行尾被pattern所匹配到的字符串,以substr替換之
查找替換實例:
- a=‘abcdefg_a_fghijklmn‘
- echo ${a/fg/dd} #替換從左邊數第一個fg為dd
- abcdedd_a_fghijklmn
- echo ${a//fg/dd} #替換字符串中所有的fg為dd
- abcdedd_a_ddhijklmn
- echo ${a/#ab/dd} #如果開頭是ab則替換成dd
- ddcdefg_a_fghijklmn
- echo ${a/#fd/dd} #如果開頭是fd則替換成dd
- abcdefg_a_fghijklmn #開頭不是fd不做替換
- echo ${a/%mn/dd} #結尾是mn則替換成dd
- abcdefg_a_fghijkldd
- echo ${a/%fd/dd} #如果結尾是fd則替換成dd
- abcdefg_a_fghijklmn #結尾並不是fd不做替換
四、查找並刪除字符串
和查找替換類似,只不過沒有替換值
${var/pattern}:刪除var所表示的字符串中第一次被pattern所匹配到的字符串
${var//pattern}:刪除var所表示的字符串中所有被pattern所匹配到的字符串
${var/#pattern}:刪除var所表示的字符串中所有以pattern為行首所匹配到的字符串
${var/%pattern}:刪除var所表示的字符串中所有以pattern為行尾所匹配到的字符串
和查找替換語法一樣,只不過沒有替換值和斜線,這裏就不做演示了。
五、符大小寫轉換
${var^^}:把var中的所有小寫字母轉換為大寫
${var,,}:把var中的所有大寫字母轉換為小寫
總結:使用shell內部的字符串處理功能能提高很多的工作效率,以及節省部分機器性能,但是需要註意的一點,字符串處理變量的值並不會改變變量的數據,只是輸出的時候進行了變更。
六、字符串變量賦值
使用字符串的變量賦值,可以代替部分的if else讓語法更簡潔。
shell字符串處理