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技巧:使用参数扩展” 开头的文章。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。