Background
- 在写脚本时,经常会涉及到字符串相关操作。当然,像awk、sed等都可以实现字符串各种操作。不过,使用shell内部操作符会省略启动外部程序等时间,速度相差上百倍,调用外部命令处理,与内置操作符性能相差非常大(见下例1所示1)。在shell编程中,尽量用内置操作符或者函数完成。
- 这里记录下常用的字符串处理方法,方便以后查找使用。
一、这里 wlf
字符串为例进行几个实例操作
[root@elephant ~]# wlf=/root/projects/hzz/hzz-server/hzz-server-1.0-SNAPSHOT.jar
[root@elephant ~]# echo $wlf
/root/projects/hzz/hzz-server/hzz-server-1.0-SNAPSHOT.jar
[root@elephant ~]#
1、获取 项目jar包
【hzz-server-1.0-SNAPSHOT.jar】
文末对
方法1
和方法3
进行了性能测试,结果自己看吧。使用其他非内置操作符如awk、sed等会出现类似方法3
的结果,不信自己测试哈。
- 方法1(内置操作符)
# #号代表从左向右删除,第二个#号代表一直删除到最后一个,*/代表删除斜杠左面的
[root@elephant ~]# echo ${wlf##*/}
hzz-server-1.0-SNAPSHOT.jar
[root@elephant ~]#
- 方法2
第一步:用斜杠
/
切分成数组,四个/
的含义:第一个代表字符串替换,第二个代表全局替换,第三个代表替换哪个字符串,第四个代表替换成哪个字符串;这里是把斜杠/
替换成了空格,然后转成了数组。
第二步:打印数组内容(这里@
可用*
)。
第三步:打印数组下标(这里@
可用*
)。
第四步:根据下标取内容。
注意: 1234代表四个斜杠/
,见下图(这里我咨询csdn客服了,无法显示四个斜杠哈)。
# 这里的1234代表四个斜杠/,见下图
[root@elephant ~]# arr_wlf=(${wlf1234 })
[root@elephant ~]# echo ${arr_wlf[@]}
root projects hzz hzz-server hzz-server-1.0-SNAPSHOT.jar
[root@elephant ~]# echo ${!arr_wlf[@]}
0 1 2 3 4
[root@elephant ~]# echo ${arr_wlf[4]}
hzz-server-1.0-SNAPSHOT.jar
[root@elephant ~]#
- 方法3(非内置操作符)
这里使用的是cut命令,指定分隔符为斜杠
/
,取第六域。
[root@elephant ~]# echo $wlf | cut -d / -f6
hzz-server-1.0-SNAPSHOT.jar
[root@elephant ~]#
3、获取 jar包所在目录
【/root/projects/hzz/hzz-server/】
这里
%
与前面的#
刚好相反,是从右向左删除,只有一个%
说明从右向左删除直到第一个斜杠/
[root@elephant ~]# echo ${wlf%/*}
/root/projects/hzz/hzz-server
[root@elephant ~]#
4、获取 项目名
【hzz-server-1.0】
[root@elephant ~]# wlf_jar=${wlf##*/}
[root@elephant ~]# echo $wlf_jar
hzz-server-1.0-SNAPSHOT.jar
[root@elephant ~]# echo ${wlf_jar%-*}
hzz-server-1.0
[root@elephant ~]#
5、获取 项目jar包后缀
【SNAPSHOT.jar】
[root@elephant ~]# echo ${wlf_jar##*-}
SNAPSHOT.jar
[root@elephant ~]#
6、获取 项目所在目录
【/root/projects/hzz/hzz-server/】
[root@elephant ~]# echo ${wlf%/*}
/root/projects/hzz/hzz-server
[root@elephant ~]#
二、字典操作
注意字典使用需要先声明。
# 必须先声明
[root@elephant ~]# declare -A wlf_dict
# 定义字典
[root@elephant ~]# wlf_dict=([k1]="v1" [k2]="v2" [k3]="v3")
# 打印所有值
[root@elephant ~]# echo ${wlf_dict[@]}
v1 v3 v2
# 打印所有key
[root@elephant ~]# echo ${!wlf_dict[@]}
k1 k3 k2
# 打印指定key的值
[root@elephant ~]# echo ${wlf_dict[k3]}
v3
[root@elephant ~]#
最后附上性能测试用例源码
[root@elephant ~]# time for i in $(seq 10000);do a=${wlf##*/};done;
real 0m0.105s
user 0m0.103s
sys 0m0.001s
[root@elephant ~]# time for i in $(seq 10000);do a=$(echo $wlf | cut -d / -f6);done;
real 0m22.392s
user 0m13.421s
sys 0m16.041s
[root@elephant ~]#
例子1【性能差了多少自己看吧】
↩︎