在平常運維工做中,常常會碰到須要在一個字符串中截取咱們須要的某些字符的需求,以前介紹了Shell腳本中數組的使用方法,這裏介紹下基於字符串的截取的方法。在shell中截取字符串的方法有下面集中:
${var#*/}
${var##*/}
${var%/*}
${var%%/*}
${var:start:len}
${var:start}
${var:0-start:len}
${var:0-start}html
1) 得到字符串的長度
語法:${#var} shell
[root@kevin~]# cat test.sh #!/bin/bash str="http://www.kevin.com/shibo/anhuigrace" echo "string: [${str}]" length=${#str} echo "length: [${length}]" 執行結果爲: [root@kevin~]# sh test.sh string: [http://www.kevin.com/shibo/anhuigrace] length: [37]
2)使用 # 和 ## 獲取尾部子字符串 (*號在分隔符的前面,就去掉其以前的字符)
2.1) # 最小限度從前面截取word
語法:${parameter#*word} , 即截取 "第一個分隔符word及其以前的字符所有刪掉"後的字符數組
[root@kevin~]# cat test.sh #!/bin/bash str="http://www.kevin.com/shibo/anhuigrace" echo "string: [${str}]" #分割符爲'/' substr=${str#*/} echo "substr: [${substr}]" 執行結果爲: [root@kevin~]# sh test.sh string: [http://www.kevin.com/shibo/anhuigrace] substr: [/www.kevin.com/shibo/anhuigrace]
2.2) ## 最大限度從前面截取word
語法:${parameter##*word},即截取 "最後一個分隔符word及其以前的字符所有刪掉"後的字符tomcat
[root@kevin~]# cat test.sh #!/bin/bash str="http://www.kevin.com/shibo/anhuigrace" echo "string: [${str}]" #分割符爲'/' substr=${str##*/} echo "substr : [${substr}]" 執行結果爲: [root@kevin~]# sh test.sh string: [http://www.kevin.com/shibo/anhuigrace] substr : [anhuigrace]
3) 使用 % 和 %% 獲取頭部子字符串 (*在分隔符的後面,就去掉其以後的字符)
3.1) % 最小限度從後面截取word
語法:${parameter%word*},即截取 "最後一個分隔符word及其以後的字符所有刪掉"後的字符bash
[root@kevin~]# cat test.sh #!/bin/bash str="http://www.kevin.com/shibo/anhuigrace" echo "string: [${str}]" substr=${str%/*} echo "substr : [${substr}]" 執行結果爲: [root@kevin~]# sh test.sh string: [http://www.kevin.com/shibo/anhuigrace] substr : [http://www.kevin.com/shibo]
3.2) %% 最大限度從後面截取word
語法:${parameter%%*word},即截取 "第一個分隔符word及其以後的字符所有刪掉"後的字符運維
[root@kevin~]# cat test.sh #!/bin/bash str="http://www.kevin.com/shibo/anhuigrace" echo "string: [${str}]" substr=${str%%/*} echo "substr : [${substr}]" 執行結果爲: [root@kevin~]# sh test.sh string: [http://www.kevin.com/shibo/anhuigrace] substr : [http:]
4)使用 ${var:} 模式獲取子字符串
4.1) 指定從左邊第幾個字符開始以及子串中字符的個數
語法:${var:start:len}ui
[root@kevin~]# cat test.sh #!/bin/bash str="http://www.kevin.com/shibo/anhuigrace" echo "string: [${str}]" #其中的 0 表示左邊第一個字符開始,7 表示子字符的總個數。 substr=${str:0:7} echo "substr : [${substr}]" 執行結果爲: [root@kevin~]# sh test.sh string: [http://www.kevin.com/shibo/anhuigrace] substr : [http://]
4.2) 從左邊第幾個字符開始一直到結束
語法:${var:7}spa
[root@kevin~]# cat test.sh #!/bin/bash str="http://www.kevin.com/shibo/anhuigrace" echo "string: [${str}]" #其中的7表示左邊第8個字符開始 (若是是${str:7:5},就表示從左邊第8個字符開始截取,截取5個字符) substr=${str:7} echo "substr : [${substr}]" 執行結果爲: [root@kevin~]# sh test.sh string: [http://www.kevin.com/shibo/anhuigrace] substr : [www.kevin.com/shibo/anhuigrace]
4.3) 從右邊第幾個字符開始以及字符的個數
語法:${var:0-start:len};即${var:0-8,3} 和 ${var:2-10:3} 和 ${var:5:13:3} 是同樣的,即從右邊第8個開始截取,截取3個字符。 即8-0=10-2=13-5=8 htm
[root@kevin~]# cat test.sh #!/bin/bash str="http://www.kevin.com/shibo/anhuigrace" echo "string: [${str}]" #其中的 0-23 表示右邊算起第23個字符開始,5 表示字符的個數 substr=${str:0-23:5} echo "substr : [${substr}]" 執行結果爲: [root@kevin~]# sh test.sh string: [http://www.kevin.com/shibo/anhuigrace] substr : [in.co]
4.4) 從右邊第幾個字符開始一直到結束
語法:${var:0-start}blog
[root@kevin~]# cat test.sh #!/bin/bash str="http://www.kevin.com/shibo/anhuigrace" echo "string: [${str}]" #其中的 0-6 表示右邊算起第6個字符開始 substr=${str:0-6} echo "substr : [${substr}]" 執行結果爲: [root@kevin~]# sh test.sh string: [http://www.kevin.com/shibo/anhuigrace] substr : [igrace]
======================再來看一例=========================
[root@bzacbsc01ap2001 ~]# hostname bzacbsc01ap2001 主機名中第3到第6字符是本機的業務模塊名稱,也就是cbs。下面腳本中的表示從a字符串左邊的第4個字符開始截取,截取3個字符(即3:3) [root@bzacbsc01ap2001 ~]# cat test.sh #!/bin/bash a=$(hostname) b=${a:3:3} APP=$(echo ${b}) echo "本機tomcat的安裝目錄爲: /opt/${APP}/tomcat" 執行結果爲: [root@bzacbsc01ap2001 ~]# sh test.sh 本機tomcat的安裝目錄爲: /opt/cbs/tomcat