Shell脚本中字符串的一些常用操作
字符串长度
${#string}
可以获得${string}的长度
例子:
string='How are you' echo ${#string} # 输出结果为11
字符串取子串
${string:position:length}
在${string}中, 从位置${position}开始提取长度为${length}的子串
例子:
string='How are you' echo ${string:4:3} # 索引从0开始,输出结果为:are echo ${string:4} # 省略长度,默认提取至最末尾,输出结果为:are you
字符串截取(不匹配字符)
符号 | 含义解析 |
${string#substring} |
从变量${string}的开头, 删除最短匹配${substring}的子串 |
${string##substring} |
从变量${string}的开头, 删除最长匹配${substring}的子串 |
${string%substring} |
从变量${string}的结尾, 删除最短匹配${substring}的子串 |
${string%%substring} |
从变量${string}的结尾, 删除最长匹配${substring}的子串 |
我们可以总结一下规律:
换句话来说,#总是表示左边算起,%总是表示右边算起;一个符号表示最短匹配,两个符号表示最长匹配。
我们可以利用该特点做一些有意义的事情,下面举几个例子:
# 定义字符串 f=$(realpath 空间数据处理环境搭建.pdf) # 输出该字符串变量的值,结果为/Users/tanzhenyu/Resources/Books/Python空间数据处理实战/空间数据处理环境搭建.pdf echo $f # 第一件事情:提取文件名称,输出结果为:空间数据处理环境搭建.pdf echo ${f##*/} # 第二件事情:提取文件扩展名,输出结果为:pdf echo ${f##*.} # 第三件事情:提取父目录,输出结果为:/Users/tanzhenyu/Resources/Books/Python空间数据处理实战 echo ${f%/*}
当然,Shell编程中我们也可以使用basename
和dirname
两个命令分别提取文件名和父目录名称:
# basename提取当前文件或者当前目录名称,输出结果为:空间数据处理环境搭建.pdf echo $(basename $f) # dirname提取父目录名称,输出结果为:/Users/tanzhenyu/Resources/Books/Python空间数据处理实战 echo $(dirname $f)
子串替换
符号 | 含义解析 |
${string/substring/replacement} |
使用${replacement}, 来代替第一个匹配的$substring |
${string//substring/replacement} |
使用${replacement}, 代替所有匹配的$substring |
${string/#substring/replacement} |
如果${string}的前缀匹配${substring}, 那么就用${replacement}来代替匹配到的${substring} |
${string/%substring/replacement} |
如果${string}的后缀匹配${substring}, 那么就用${replacement}来代替匹配到的${substring} |
注: ${substring}
可以是一个正则表达式.
例子:
# 把Windows的路径换成类UNIX的路径 f='C:\Windows\system32\cmd.exe' echo ${$f//\///} # 输出结果为:C:/Windows/system32/cmd.exe