平常运维的Shell脚本中截取字符串的作法

 

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