在平常运维工做中,常常会碰到须要在一个字符串中截取咱们须要的某些字符的需求,以前介绍了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