Bash腳本編程之字符串處理

簡介

其實這裏說得字符串處理,對應的是bash官網中的【Shell Parameter Expansion】,不過直接去看這部分內容實在是太難以理解了。字符串處理會比較好理解,平常使用應該也是足夠的了。

字符串切片

這塊在上一篇講解數組的文章中Bash腳本編程之數組,也大概提到了Shell Parameter Expansion除了可以對數組(array)切片以外,還可以對變量切片。

${var:offset:number}
${var: length}
[root@c7-server ~]# name="zhangwenlong"
[root@c7-server ~]# echo ${name}
zhangwenlong
[root@c7-server ~]# echo ${name:2:5}
angwe
[root@c7-server ~]# echo ${name: -4}
long

基於pattern取子串

這裏的pattern,應該是glob或者類glob的,而非正則表達式,詳見官方的Pattern Matching

${var#*pattern}:在變量var的值中自左向右查詢pattern,若查詢到,則刪除值首部至第一次出現的pattern之間的所有字符。

[root@c7-server ~]# echo ${name}
zhangwenlong
[root@c7-server ~]# echo ${name#*wen}
long
[root@c7-server ~]# echo ${name}
zhangwenlong

${var##*pattern}:在變量var的值中自左向右查詢pattern,若查詢到,則刪除值首部至最後一次出現的pattern之間的所有字符。

[root@c7-server ~]# echo ${name}
zhangwenlong
[root@c7-server ~]# echo ${name#*n}
gwenlong
[root@c7-server ~]# echo ${name##*n}
g

${var%pattern*}:在變量var的值中自右向左查詢pattern,若查詢到,則刪除值尾部至第一次出現的pattern之間的所有字符。
${var%%pattern*}:在變量var的值中自右向左查詢pattern,若查詢到,則刪除值尾部至最後一次出現的pattern之間的所有字符。

[root@c7-server ~]# echo ${name}
zhangwenlong
[root@c7-server ~]# echo ${name%n*}
zhangwenlo
[root@c7-server ~]# echo ${name%%n*}
zha

查找替換

${var/PAT/SUB}:在變量var的值中從左往右查找,只有第一次出現的PAT(pattern)會被替換成SUB(substitute)。

[root@c7-server ~]# echo ${userinfo}
root:x:0:0:root:/root:/bin/bash
[root@c7-server ~]# echo ${userinfo/r??t/CentOS}
centos:x:0:0:root:/root:/bin/bash

${var//PAT/SUB}:在變量var的值中從左往右查找,所有出現的PAT都會被替換成SUB。

[root@c7-server ~]# echo ${userinfo}
root:x:0:0:root:/root:/bin/bash
[root@c7-server ~]# echo ${userinfo//r??t/centos}
centos:x:0:0:centos:/centos:/bin/bash

${var/#PAT/SUB}:在變量var的值中從左往右查找,只有行首出現的PAT都會被替換成SUB。

[root@c7-server ~]# echo ${userinfo}
root:x:0:0:root:/root:/bin/bash
[root@c7-server ~]# echo ${userinfo/#r??t/centos}
centos:x:0:0:root:/root:/bin/bash

${var/%PAT/SUB}:在變量var的值中從左往右查找,只有行尾出現的PAT都會被替換成SUB。

[root@c7-server ~]# echo ${userinfo}
root:x:0:0:root:/root:/bin/bash
[root@c7-server ~]# echo ${userinfo/%bash/zsh}
root:x:0:0:root:/root:/bin/zsh

查找刪除

${var/PAT}:在變量var的值中從左往右查找,只有第一次出現的PAT會被刪除。

[root@c7-server ~]# echo ${userinfo}
root:x:0:0:root:/root:/bin/bash
[root@c7-server ~]# echo ${userinfo/root}
:x:0:0:root:/root:/bin/bash

${var//PAT}:在變量var的值中從左往右查找,所有出現的PAT會被刪除。

[root@c7-server ~]# echo ${userinfo}
root:x:0:0:root:/root:/bin/bash
[root@c7-server ~]# echo ${userinfo//root}
:x:0:0::/:/bin/bash

${var/#PAT}:在變量var的值中從左往右查找,只有行首出現的PAT會被刪除。

[root@c7-server ~]# echo ${userinfo}
root:x:0:0:root:/root:/bin/bash
[root@c7-server ~]# echo ${userinfo/#root}
:x:0:0:root:/root:/bin/bash

${var/%PAT}:在變量var的值中從左往右查找,只有行尾出現的PAT會被刪除。

[root@c7-server ~]# echo ${userinfo}
root:x:0:0:root:/root:/bin/bash
[root@c7-server ~]# echo ${userinfo/%bash}
root:x:0:0:root:/root:/bin/

字符大小寫轉換

${var^^}:將變量var中的所有小寫字符轉換成大寫。

${var,}:將變量var中的所有大寫字符轉換成小寫。

[root@c7-server ~]# name=RenDanChaoXian
[root@c7-server ~]# echo ${name^^}
RENDANCHAOXIAN
[root@c7-server ~]# echo ${name,,}
rendanchaoxian

變量賦值

${var:-VALUE}:如果變量var爲空或者未設置,則返回VALUE;否則返回變量var的值。注意,變量name本身的值不會被修改。

[root@c7-server ~]# echo ${name}
RenDanChaoXian
[root@c7-server ~]# echo ${name:-alongdidi}
RenDanChaoXian
[root@c7-server ~]# unset name
[root@c7-server ~]# echo ${name:-alongdidi}
alongdidi
[root@c7-server ~]# echo ${name}

[root@c7-server ~]# name=
[root@c7-server ~]# echo ${name:-alongdidi}
alongdidi
[root@c7-server ~]# echo ${name}

[root@c7-server ~]#

${var:=VALUE}:如果變量var爲空或者未設置,則返回VALUE,並將VALUE賦值給變量var;否則返回變量var的值。

[root@c7-server ~]# name=zwl
[root@c7-server ~]# echo ${name}
zwl
[root@c7-server ~]# echo ${name:=alongdidi}
zwl
[root@c7-server ~]# unset name
[root@c7-server ~]# echo ${name:=alongdidi}
alongdidi
[root@c7-server ~]# echo ${name}
alongdidi
[root@c7-server ~]# name=
[root@c7-server ~]# echo ${name:=alongdidi}
alongdidi
[root@c7-server ~]# echo ${name}
alongdidi

${var:+VALUE}:如果變量爲空或者未設置,那麼不會返回任何值。否則則返回VALUE的值。注意,變量name本身的值不會被修改。

[root@c7-server ~]# name=
[root@c7-server ~]# echo ${name:+alongdidi}

[root@c7-server ~]# unset name
[root@c7-server ~]# echo ${name:+alongdidi}

[root@c7-server ~]# name=zwl
[root@c7-server ~]# echo ${name:+alongdidi}
alongdidi
[root@c7-server ~]# echo ${name}
zwl
[root@c7-server ~]#

${var:?ERROR_INFO}:如果變量var爲空或者未設置,則返回錯誤信息ERROR_INFO;否則返回變量var的值。

[root@c7-server ~]# name=
[root@c7-server ~]# echo ${name:?"There is something wrong"}
-bash: name: There is something wrong
[root@c7-server ~]# unset name
[root@c7-server ~]# echo ${name:?"There is something wrong"}
-bash: name: There is something wrong
[root@c7-server ~]# name=zwl
[root@c7-server ~]# echo ${name:?"There is something wrong"}
zwl
發佈了15 篇原創文章 · 獲贊 13 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章