手機版
你好,游客 登錄 注冊
背景:
閱讀新聞

Bash腳本編程之字符串處理

[日期:2020-01-06] 來源:Linux社區  作者:alongdidi [字體: ]

簡介

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

字符串切片

這塊在上一篇講解數組的文章中(http://www.okbuvi.live/Linux/2020-01/161945.htm),也大概提到了Shell Parameter Expansion除了可以對數組(array)切片以外,還可以對變量切片。

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

基于pattern取子串

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

${var#*pattern}:在變量var的值中自左向右查詢pattern,若查詢到,則刪除值首部至第一次出現的pattern之間的所有字符。
[[email protected] ~]# echo ${name}
zhangwenlong
[[email protected]-server ~]# echo ${name#*wen}
long
[[email protected]-server ~]# echo ${name}
zhangwenlong
${var##*pattern}:在變量var的值中自左向右查詢pattern,若查詢到,則刪除值首部至最后一次出現的pattern之間的所有字符。
[[email protected] ~]# echo ${name}
zhangwenlong
[[email protected]-server ~]# echo ${name#*n}
gwenlong
[[email protected]-server ~]# echo ${name##*n}
g
${var%pattern*}:在變量var的值中自右向左查詢pattern,若查詢到,則刪除值尾部至第一次出現的pattern之間的所有字符。
${var%%pattern*}:在變量var的值中自右向左查詢pattern,若查詢到,則刪除值尾部至最后一次出現的pattern之間的所有字符。
[[email protected] ~]# echo ${name}
zhangwenlong
[[email protected]-server ~]# echo ${name%n*}
zhangwenlo
[[email protected]-server ~]# echo ${name%%n*}
zha

查找替換

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

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

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

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

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

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

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

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

查找刪除

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

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

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

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

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

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

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

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

字符大小寫轉換

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

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

[[email protected] ~]# name=RenDanChaoXian
[[email protected]-server ~]# echo ${name^^}
RENDANCHAOXIAN
[[email protected]-server ~]# echo ${name,,}
rendanchaoxian

變量賦值

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

[[email protected] ~]# echo ${name}
RenDanChaoXian
[[email protected]-server ~]# echo ${name:-alongdidi}
RenDanChaoXian
[[email protected]-server ~]# unset name
[[email protected]-server ~]# echo ${name:-alongdidi}
alongdidi
[[email protected]-server ~]# echo ${name}

[[email protected]-server ~]# name=
[[email protected]-server ~]# echo ${name:-alongdidi}
alongdidi
[[email protected]-server ~]# echo ${name}

[[email protected]-server ~]#

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

[[email protected] ~]# name=zwl
[[email protected]-server ~]# echo ${name}
zwl
[[email protected]-server ~]# echo ${name:=alongdidi}
zwl
[[email protected]-server ~]# unset name
[[email protected]-server ~]# echo ${name:=alongdidi}
alongdidi
[[email protected]-server ~]# echo ${name}
alongdidi
[[email protected]-server ~]# name=
[[email protected]-server ~]# echo ${name:=alongdidi}
alongdidi
[[email protected]-server ~]# echo ${name}
alongdidi

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

[[email protected] ~]# name=
[[email protected]-server ~]# echo ${name:+alongdidi}

[[email protected]-server ~]# unset name
[[email protected]-server ~]# echo ${name:+alongdidi}

[[email protected]-server ~]# name=zwl
[[email protected]-server ~]# echo ${name:+alongdidi}
alongdidi
[[email protected]-server ~]# echo ${name}
zwl
[[email protected]-server ~]#

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

[[email protected] ~]# name=
[[email protected]-server ~]# echo ${name:?"There is something wrong"}
-bash: name: There is something wrong
[[email protected]-server ~]# unset name
[[email protected]-server ~]# echo ${name:?"There is something wrong"}
-bash: name: There is something wrong
[[email protected]-server ~]# name=zwl
[[email protected]-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”方可退出腳本。

linux
本文評論   查看全部評論 (0)
表情: 表情 姓名: 字數

       

評論聲明
  • 尊重網上道德,遵守中華人民共和國的各項有關法律法規
  • 承擔一切因您的行為而直接或間接導致的民事或刑事法律責任
  • 本站管理人員有權保留或刪除其管轄留言中的任意內容
  • 本站有權在網站內轉載或引用您的評論
  • 參與本評論即表明您已經閱讀并接受上述條款
海口彩票论坛