很多时候在使用Linux的shell时,我们都需要对文件名或目录名进行处理,通常的操作是由路径中提取出文件名,从路径中提取出目录名,提取文件后缀名等等。例如,从路径/dir1/dir2/file.txt中提取也文件名file.txt,提取出目录/dir1/dir2,提取出文件后缀txt等。

下面介绍两种常用的方法来进行相关的操作。

一、使用${}

1、${var##*/}
该命令的作用是去掉变量var从左边算起的最后一个'/'字符及其左边的内容,返回从左边算起的最后一个'/'(不含该字符)的右边的内容。使用例子及结果如下:

从运行结果可以看到,使用该命令,可以提取出我们需要的文件名file.txt。

若使用时在shell程序文件中,可以使用变量来保存这个结果,再加以利用,如file=${var##*/}

2、${var##*.}
该命令的作用是去掉变量var从左边算起的最后一个'.'字符及其左边的内容,返回从左边算起的最后一个'.'(不含该字符)的右边的内容。使用例子及结果如下:

从运行结果可以看到,使用该命令,可以提取出我们需要的文件后缀。

如果文件的后缀不仅有一个,例如,file.tar.gz,命令${var##*.}仅能提取最后一个后缀,而我想提取tar.gz时该怎么办?那么就要用下面所说的${var#*.}命令了。

3、${var#*.}
该命令的作用是去掉变量var从左边算起的第一个'.'字符及其左边的内容,返回从左边算起第一个'.'(不含该字符)的右边部分的内容。使用例子及结果如下:

从运行结果可以看到,使用该命令,可以提取出文件的多个后缀。

4、${var%/*}
该命令的使用是去掉变量var从右边算起的第一个'/'字符及其右边的内容,返回从右边算起的第一个'/'(不含该字符)的左边的内容。使用例子及结果如下:

从运行的结果可以看到,使用该命令,可以提取出我们需要的文件所在的目录

5、${var%%.*}
该命令的使用是去掉变量var从右边算起的最后一个'.'字符及其右边的内容,返回从右边算起的最后一个'.'(不含该字符)的左边的内容。使用例子及结果如下:

当我们需要建立一个与文件名相同名字(没有后缀)的目录与对应的文件相对应时,就可以使用该命令来进行操作。例如,解压文件的情况就与此类似,我们压缩文件file.zip时,会在与file.zip同级目录下建立一个名为file的目录。

6、${}总结

其实${}并不是专门为提取文件名或目录名的,它的使用是变量的提取和替换等等操作,它可以提取非常多的内容,并不一定是上面五个例子中的'/'或'.'。也就是说,上面的使用方法只是它使用的一个特例。

看到上面的这些命令,可能会让人感到非常难以理解和记忆,其实不然,它们都是有规律的。

#:表示从左边算起第一个

%:表示从右边算起第一个

##:表示从左边算起最后一个

%%:表示从右边算起最后一个

换句话来说,#总是表示左边算起,%总是表示右边算起。

*:表示要删除的内容,对于#和##的情况,它位于指定的字符(例子中的'/'和'.')的左边,表于删除指定字符及其左边的内容;对于%和%%的情况,它位于指定的字符(例子中的'/'和'.')的右边,表示删除指定字符及其右边的内容。这里的'*'的位置不能互换,即不能把*号放在#或##的右边,反之亦然。

例如:${var%%x*}表示找出从右边算起最后一个字符x,并删除字符x及其右边的字符。

看到这里,就可以知道,其实该命令的用途非常广泛,上面只是指针文件名和目录名的命名特性来进行提取的一些特例而已。

二、basename和dirname

${}并不是专门为提取文件名和目录名设计的命令,那么basename和dirname命令就是专门为做这一件事而已准备的了。

1、basename

该命令的作用是从路径中提取出文件名,使用方法为basename NAME [SUFFIX]。

1)从路径中提出出文件名(带后缀),例子如下:

2)从上面命令的用法中可以看到,后缀(SUFFIX)是一个可选项。所以,若只想提取出文件名file,而不带有后缀,还可以在变量的后面加上后缀名,例子如下:

2、dirname
该命令的作用是从路径中提取出目录名,使用方法为 dirname NAME
使用例子如下:

这样就提取出了file.txt文件所在的目录。

注:该命令不仅能提取出普通文件所的目录,它能提取出任何文件所在的目录,例如目录所在的目录,如下:

它提取出了目录dir2所在的目录dir1.

转载于:https://blog.51cto.com/853056088/2127935

活用变量字符串${var%%.*}相关推荐

  1. OC 实例变量(instance var)与属性(@property)的关系 isa指针

    实例变量(instance var)与属性(@property)的关系 Objective-C 2.0之后,声明一个@property name自动产生一个实例变量,名为_name,因此省去实例变量和 ...

  2. JDK10的新特性:本地变量类型var

    文章目录 简介 为什么我们需要var var使用在什么地方 var不能用在什么地方 其他var的特点 总结 简介 java以面向对象的特性显著于世并得到了蓬勃的发展.在语言的发展过程中,为了让java ...

  3. scala的两种变量类型 var 和 val

    scala的两种变量类型 var 和 valscala的两种变量类型 var 和 val 在Java中,您可以这样声明新变量: String s = "hello"; int i ...

  4. js中定义变量之②var let const的区别

    var 上一篇文章有讲过,是js定义变量的关键词. 但是在es6中,新添加了两个关键词,用于变量声明的关键词:let 和const 接下来就说一下var let 和const的区别: 首先说var 用 ...

  5. Javascript中函数中定义变量无var

    参考: https://wiki.jikexueyuan.com/project/brief-talk-js/about-var.html 前段时间回答了一个关于定义变量时使用关键字 var 与否的区 ...

  6. html页面使用var变量,使用var定义变量和不使用var的本质区别

    最基本的var关键字是上下文的,而不采用var是全局的这就不讨论了 "不管是使用var关键字(在全局上下文)还是不使用var关键字(在任何地方),都可以声明一个变量".这貌似一个错 ...

  7. golang | 变量-字符串练习

    func main() {//1.编写代码分别定义一个整型.浮点型.布尔型.字符串型变量,使用fmt.Printf()搭配%T分别打印出上述变量的值和类型.a, b, c, d := 100, 3.1 ...

  8. nginx变量ngx.var

    ngx.var 是获取 Nginx 的变量,类型是字符串或nil,需要经历字符串 hash.hash 表查找等过程. ngx.ctx 仅仅是一个 Lua table 而已,它的引用存放在 ngx_lu ...

  9. js中定义变量加var和不加var的区别

    这个问题其实我在面试的时候有被问到过,当时我记得我回答的很模糊,面试官看到我好像不太清楚,又问我是不是可以不加var定义变量... 正好昨天做项目的时候想到这个问题,觉得这种细节上的问题才是拉开差距的 ...

最新文章

  1. RxAndroid之操作数据库SqlBrite(RXAndroid实现数据库的增、删、改、查)
  2. linux系统程序PPT,Linux 系统应用与程序设计 问题.ppt
  3. codeblocks调试窗口字体大小以及修改主题
  4. 电热水器工作过程 c语言,热水器工作流程图
  5. BottomNavigationView的使用
  6. 国际化标签 fmt:bundlefmt:message的使用
  7. 多年心路历程见证从技术小白到收获BAT等大厂研发offer,分享一些经验和感悟...
  8. Linux之判断socket是否断开
  9. Oracle9iClient简化版的安装与tnsnames配置,sqlplus的连接
  10. vue+bootstrap项目
  11. python调用百度查询关键字_Python模拟搜索百度关键字
  12. c语言delay函数的作用,delay函数 delay() c语言延迟函数
  13. c#、cefsharp 获取、提取 img、image 图片标签二进制数据
  14. 2011年IT行业薪资调查报告
  15. 【转载】MLC(Multi-Label Classification) 多标签分类
  16. 如何将英文pdf文档在线翻译成中文?
  17. SpringCloud系列之Eureka服务注册及发现
  18. Spark DAG与RDD
  19. 身为编辑者,居然无法提交申请?
  20. 资源名称中英文特殊字符乱码处理

热门文章

  1. java uppercase方法_Java toUpperCase()方法及其示例
  2. servlet中弹出对话框
  3. myeclipse写简单bbs代码_RabbitMQ实现即时通讯居然如此简单!连后端代码都省得写了?...
  4. beats耳机用安卓手机影响音效么_感受清晰细腻音质,实用有线入耳式耳机推荐...
  5. 用力和应变片计算弹性模量_实验力学实验讲义(08.9).doc
  6. aspen怎么做灵敏度分析_数据分析终极难题:数据分析怎么做才能驱动业务?
  7. datatable 创建列赋值_DataTable创建行和列,DataReader读取
  8. 印度程序员为什么牛掰之ISAS.激发人的兴趣.探索精神.
  9. C# 三层级架构问题之 能加载文件或程序集或它的某一个依赖项。系统找不到指定的文件
  10. java 连接redis_Redis 开发陷阱及避坑指南!