shell 字符串操作实例

本文介绍了如何在shell编程中利用内置操作符快速处理字符串,包括提取jar包名、路径、项目名等,同时展示了字典操作的实用性和性能对比。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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. 例子1【性能差了多少自己看吧】
    在这里插入图片描述 ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WaiSaa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值