簡介 其實這裡說得字元串處理,對應的是bash官網中的【Shell Parameter Expansion】,不過直接去看這部分內容實在是太難以理解了。就按照馬哥所說的字元串處理會比較好理解,平常使用應該也是足夠的了。 字元串切片 這塊在上一篇講解數組的文章中,也大概提到了Shell Paramet ...
簡介
其實這裡說得字元串處理,對應的是bash官網中的【Shell Parameter Expansion】,不過直接去看這部分內容實在是太難以理解了。就按照馬哥所說的字元串處理會比較好理解,平常使用應該也是足夠的了。
字元串切片
這塊在上一篇講解數組的文章中,也大概提到了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
練習
寫一個腳本,實現如下功能:
提示用戶輸入一個可執行的命令的名稱,如ls。
獲取該命令所依賴的庫文件列表(藉助ldd命令)。
複製命令至某目標目錄(例如:/mnt/sysroot/,即將此目錄當做新的根目錄)下的對應路徑中。
bash, /bin/bash --> /mnt/sysroot/bin/bash
useradd, /usr/sbin/useradd --> /mnt/sysroot/usr/sbin/useradd
複製命令所依賴的庫文件至對應的目標目錄下。
/lib64/ld-linux-x8664.so.2 --> /mnt/sysroot/lib64/ld-linux-x8664.so.2
進階:每次複製完一個命令後不退出,而是等待用戶鍵入新的需要複製的命令,直到用戶顯示輸入“quit”方可退出腳本。