簡介
其實這裏說得字符串處理,對應的是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