Bash技巧:实例介绍多个处理字符串变量的参数扩展表达式

ByteLuminaPro
• 阅读 1539

Linux 的 bash shell 提供了多种形式的参数扩展表达式,可以获取变量自身的值,或者对变量值进行特定处理得到一个新的值,等等。
本篇文章对字符串变量值相关的参数扩展表达式进行汇总说明。

假设在 bash 中定义了 filepath=example/subdir/testfile.txt 这样一个变量,可以使用下面的参数扩展来获取一些值:

  • ${filepath}
    获取 filepath 变量的值。
    例如,echo ${filepath} 命令打印的结果是 example/subdir/testfile.txt
  • ${#filepath}
    获取到 filepath 变量值的字符个数,也就是字符串长度。
    例如,echo ${#filepath} 命令打印的结果是 27。
  • ${filepath:4:3}
    filepath 变量值开头的第 4 个字符开始,往后获取三个字符,得到一个子字符串。
    例如,echo ${filepath:4:3} 命令打印的结果是 ple
    注意是从开头的第 0 个字符开始数起。
    这个表达式的格式是 ${parameter:offset:length},offset 指定从哪个位置开始获取字符,length 指定获取多少个字符。
  • ${filepath: -3:3}
    filepath 变量值倒数的第 3 个字符开始,往后获取三个字符,得到一个子字符串。
    例如,echo ${filepath: -3:3} 命令打印的结果是 txt
    负数的 offset 表示倒数的偏移值。冒号和负号之间要加空格。
    注意是从末尾的第 1 个字符开始往前数。
  • ${filepath#*/}
    filepath 变量值中,从头开始匹配所给的 */ 这个模式,删除第一个匹配的模式,返回后面剩余的内容。
    这里用 * 通配符来匹配开头的任意字符串。
    例如,echo ${filepath#*/} 打印的结果是 subdir/testfile.txt
    这个表达式的格式是 ${parameter#word},从 parameter 变量值中删除最短匹配 word 的前缀部分。
  • ${filepath##*/}
    filepath 变量值中,从头开始匹配所给的 */ 这个模式,一直删除到最后一个匹配的模式,返回后面剩余的内容。
    这里用 * 通配符来匹配开头的任意字符串。
    例如,echo ${filepath##*/} 打印的结果是 testfile.txt
    这个表达式的格式是 ${parameter##word},从 parameter 变量值中删除最长匹配 word 的前缀部分。
  • ${filepath%/*}
    filepath 变量值中,从末尾往前匹配所给的 /* 这个模式,删除第一个匹配的模式,返回前面剩余的内容。
    这里用 * 通配符来匹配末尾的任意字符串。
    例如,echo ${filepath%/*} 打印的结果是 example/subdir
    这个表达式的格式是 ${parameter%word},从 parameter 变量值中删除最短匹配 word 的后缀部分。
  • ${filepath%%/*}
    filepath 变量值中,从末尾往前匹配所给的 /* 这个模式,一直删除到最后一个匹配的模式,返回前面剩余的内容。
    这里用 * 通配符来匹配末尾的任意字符串。
    例如,echo ${filepath%%/*} 打印的结果是 example
    这个表达式的格式是 ${parameter%%word},从 parameter 变量值中删除最长匹配 word 的后缀部分。
  • ${filepath/[et]/M}
    filepath 变量值中,把第一个匹配的小写字母 e、或者小写字母 t,替换成大写字母 M。
    这里用 [et] 路径名扩展来匹配小写字母 e、或者小写字母 t。
    这个表达式的格式是 ${parameter/pattern/string},把匹配 pattern 的字符串替换成 string 字符串。
    只替换第一个匹配的模式字符串。这个模式字符串可以位于变量值的开头、中间、以及末尾部分。
    例如,echo ${filepath/[et]/M} 打印的结果是 Mxample/subdir/testfile.txt
  • ${filepath//[et]/M}
    filepath 变量值中,把所有匹配的小写字母 e、或者小写字母 t,替换成大写字母 M。
    这里用 [et] 扩展来匹配小写字母 e、或者小写字母 t。
    让 pattern 模式字符串以字符 ‘/’ 开头,表示替换所有匹配的字符串。
    例如,echo ${filepath//[et]/M} 打印的结果是 MxamplM/subdir/MMsMfilM.MxM
  • ${filepath/subdir}
    filepath 变量值中,删除匹配的 subdir 字符串。
    例如,echo ${filepath/subdir} 打印的结果是 example//testfile.txt
    这个表达式没有提供替换之后的字符串,表示删除所匹配的字符串。
    ${parameter#word} 只能删除匹配的前缀。${parameter%word} 只能删除匹配的后缀
    ${parameter/pattern} 可以删除任意位置的匹配字符串,包括中间位置
  • ${filepath^^}
    filepath 变量值的所有字符都转换为大写。
    例如,echo ${filepath^^} 打印的结果是 EXAMPLE/SUBDIR/TESTFILE.TXT
    这个表达式的格式是 ${parameter^^pattern},把 parameter 变量值中匹配 pattern 模式的每一个小写字母都转成大写。
    如果没有提供 pattern 模式,表示匹配任意一个字符。
  • ${filepath,,}
    filepath 变量值的所有字符都转换为小写。
    例如,echo ${filepath,,} 打印的结果是 example/subdir/testfile.txt
    这个表达式的格式是 ${parameter,,pattern},把 parameter 变量值中匹配 pattern 模式的每一个大写字母都转成小写。
    如果没有提供 pattern 模式,表示匹配任意一个字符。
  • ${filepath^}
    filepath 变量值的首字符转成大写。
    例如,echo ${filepath^} 打印的结果是 Example/subdir/testfile.txt
    这个表达式的格式是 ${parameter^pattern},把匹配 pattern 模式的 parameter 变量值首字符转成大写。
    如果没有提供 pattern 模式,表示匹配任意单个字符。
  • ${filepath,}
    filepath 变量值的首字符转成小写。
    例如,echo ${filepath,} 打印的结果是 example/subdir/testfile.txt
    这个表达式的格式是 ${parameter,pattern},把匹配 pattern 模式的 parameter 变量值首字符转成小写。
    如果没有提供 pattern 模式,表示匹配任意单个字符。

上面内容汇总说明了多个字符串变量值相关的扩展表达式,方便统一收藏查阅

关于这些扩展表达式的详细说明、以及更多的测试例子,可以查看我前面三篇以 “Bash技巧:使用参数扩展” 开头的文章。

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Easter79 Easter79
3年前
swap空间的增减方法
(1)增大swap空间去激活swap交换区:swapoff v /dev/vg00/lvswap扩展交换lv:lvextend L 10G /dev/vg00/lvswap重新生成swap交换区:mkswap /dev/vg00/lvswap激活新生成的交换区:swapon v /dev/vg00/lvswap
Wesley13 Wesley13
3年前
Java日期时间API系列31
  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前
Peter20 Peter20
4年前
mysql中like用法
like的通配符有两种%(百分号):代表零个、一个或者多个字符。\(下划线):代表一个数字或者字符。1\.name以"李"开头wherenamelike'李%'2\.name中包含"云",“云”可以在任何位置wherenamelike'%云%'3\.第二个和第三个字符是0的值wheresalarylike'\00%'4\
Wesley13 Wesley13
3年前
VBA中msgbox的用法小结
1、作用在消息框中显示信息,并等待用户单击按钮,可返回单击的按钮值(比如“确定”或者“取消”)。通常用作显示变量值的一种方式。2、语法MsgBox(Prompt\,Buttons\\,Title\\,Helpfile,Context\)参数说明:(1)Prompt,必需的参数,为字符串,作为显示在消息框中的消息文本。
Wesley13 Wesley13
3年前
mysql中时间比较的实现
MySql中时间比较的实现unix\_timestamp()unix\_timestamp函数可以接受一个参数,也可以不使用参数。它的返回值是一个无符号的整数。不使用参数,它返回自1970年1月1日0时0分0秒到现在所经过的秒数,如果使用参数,参数的类型为时间类型或者时间类型的字符串表示,则是从1970010100:00:0
Easter79 Easter79
3年前
SpringMvc接受特殊符号参数被转义
WEB开发时,在前端通过get/post方法传递参数的时候 如果实参附带特殊符号,后端接收到的值中特殊符号就会被转义例如该请求: http://localhost:10001/demo/index.do?name张三(1)注:中文()不会出现此种情况后台就收到的实际name值为:  张三&40;1&41;&40;其实为h
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这