当前位置: 首页 > news >正文

变量替换 删除

shell 13问 https://www.cnblogs.com/rustling/p/9833174.html

 

shell内置了对变量进行删除和替换的功能,非常的方便。虽然平时用的机会非常少,但是阅读别人写的脚本时,会经常遇到。
所以进行一个学习总结。

${var#pattern}  从变量头部开始匹配模式,将符合的最短数据删除
${var##pattern} 从变量头部开始匹配模式,将符合的最长数据删除
${var%pattern}  从变量尾部开始匹配模式,将符合的最短数据删除
${var%%pattern} 从变量尾部开始匹配模式,将符合的最长数据删除
${var/oldPattern/newPattern}  将第一个符合旧模式的数据替换为新模式
${var//oldPattern/newPattern} 将全部符合旧模式的数据替换为新模式

#和%是删除符号。在键盘上,#号在$的左边,所以是从左边开始删除,%在$符的右边,所以是从右边开始删除。

/是替换符

最常用的场景:
1.输出文件的后缀

例如要判断文件的后缀名

var1=me.txt
echo ${var1#*.}
txt
用#会匹配上第一个点和之前的内容,删除掉之后就获得了后缀名txt。

var=me.pdf.txt
echo ${var##*.}
txt
假如文件名中本身含有点就会让上一种写法失效,此时应该用##来匹配最长数据。

2.输出文件名

类似上面的例子,这次是要输出文件名

echo ${var1%%.}
me
可见,%删除了从右边起第一个点及其右边的字符,剩下的就是文件名了。
echo ${var%.
}
me.pdf
假如文件名中本身含有点也是会让上一种写法失效,此时用%来做最短匹配就行了。

3.替换部分字符

var=hello123hello123
echo ${var/123/456}
hello456hello123
echo ${var//123/456}
hello456hello456
可以看到第一个操作将首个123替换为456,第二个操作将所有123都变为456。

个人理解,shell只支持*号这个通配符,有匹配最短和最长数据这两种模式,没有完整的正则表达式支持。

在网上看到这样一段脚本:

##ipv4 or ipv6
tempIp="xxxx"
if [ "$tempIp" != "${#tempIp#*[0-9].[0-9]}" ]
then
    ##ipv4
else
    ##ipv6
fi

其作用是判断是ipv4地址还是ipv6地址。
其原理就是删除匹配这个规律的部分:开始任意个任意字符+1个数字+点号+1个数字
所以ipv4地址肯定能够匹配上。但是IPv6地址由于不包含点 号所以匹配不上。

root@debian2:~#
root@debian2:~# tempIp="192.168.0.103"
root@debian2:~#
root@debian2:~# echo ${tempIp#*[0-9].[0-9]}
68.0.103
root@debian2:~#
root@debian2:~#
root@debian2:~# tempIpv6="::1"
root@debian2:~#
root@debian2:~# echo ${tempIpv6#*[0-9].[0-9]}
::1
root@debian2:~#

但是,这个没有考虑到一种情况,就是IPv6兼容地址中,其实是含有点号的。
更简单的方法是判断IP地址中是否包含冒号。

##ipv4 or ipv6
tempIp="xxxx"
echo $tempIp | grep -q ":"
result=$?
if [ "$result" -eq 0 ]
then
    ##ipv6
else
    ##ipv4
fi

相关文章:

  • voc数据集格式_目标检测领域数据集VOC+COCO数据集下载地址
  • mysql数据库挂科_MySQL数据库--练习
  • citespace 从安装到项目新建
  • citespace基本操作
  • php连接mysql截图_php连接mysql数据库
  • citespace 时区图 时线图 凸显图
  • idea develop分支 拉取其他分支代码_10年经验17张图带你进入gitflow企业项目代码版本管理的最佳实践...
  • citespacewebofscience下载数据
  • mysql1702_MySQL的通用优化方法
  • 从wos到结果分析 详细
  • 堆排序重建堆的时间复杂度_排序算法之 堆排序 及其时间复杂度和空间复杂度...
  • citespace关键词分析 概念树
  • mysql电子词典_电子词典阶段性小项目
  • 找不到类com.mysql_java – 在webservice 中找不到类异常Class.forName(“com.mysql.jdbc.Driver”)...
  • mysql服务器管理员_配置MySQL服务器时,需要设置一个管理员账号,其名称是( )。...
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • Apache Spark Streaming 使用实例
  • CSS 专业技巧
  • Javascripit类型转换比较那点事儿,双等号(==)
  • JavaScript标准库系列——Math对象和Date对象(二)
  • Java读取Properties文件的六种方法
  • JS函数式编程 数组部分风格 ES6版
  • Node.js 新计划:使用 V8 snapshot 将启动速度提升 8 倍
  • Python3爬取英雄联盟英雄皮肤大图
  • Python学习笔记 字符串拼接
  • REST架构的思考
  • SpiderData 2019年2月23日 DApp数据排行榜
  • spring学习第二天
  • SQL 难点解决:记录的引用
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 翻译:Hystrix - How To Use
  • 反思总结然后整装待发
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 微服务框架lagom
  • 原生Ajax
  • linux 淘宝开源监控工具tsar
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • (3)(3.5) 遥测无线电区域条例
  • (C++)八皇后问题
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (六)c52学习之旅-独立按键
  • (转)详解PHP处理密码的几种方式
  • (转)一些感悟
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .Net 代码性能 - (1)
  • .net2005怎么读string形的xml,不是xml文件。
  • .NET开发人员必知的八个网站
  • .NET设计模式(2):单件模式(Singleton Pattern)
  • .NET使用HttpClient以multipart/form-data形式post上传文件及其相关参数
  • .py文件应该怎样打开?
  • @AutoConfigurationPackage的使用
  • @javax.ws.rs Webservice注解