1.字符串长度
本章介绍 Bash 字符串常见的操作语法。
首先是获取字符串长度,方式其实和前面一章节获取数组长度类似,都是用的#
号:
${#varname}
比如:
注意这里的大括号{}
是必需的,因为$#
的含义获取脚本参数个数,有特定含义,必须要使用大括号进行分割。
2.子字符串
字符串提取子串的语法如下。
${varname:offset:length}
上面语法的含义是返回变量$varname
的子字符串,从位置offset
开始(从0
开始计算),长度为length
:
上面例子返回字符串www.kucoding.com
从3号位置开始的长度为8的子字符串.kucodin
。
这种语法不能直接操作字符串,只能通过变量来读取字符串,并且不会改变原始字符串。
# 报错
echo ${"hello":2:3}
上面例子中,"hello"
不是变量名,会导致 Bash 报错。
如果省略length
,则从位置offset
开始,一直返回到字符串的结尾:
上面例子是返回变量ku
从4号位置一直到结尾的子字符串。
如果offset
为负值,表示从字符串的末尾开始算起。
注意,负数前面必须有一个空格, 以防止与${variable:-word}
的变量的设置默认值语法混淆。
这时还可以指定length
,length
可以是正值,也可以是负值(负值不能超过offset
的长度)。
foo="This string is long."
echo ${foo: -5}
echo ${foo: -5:2}
echo ${foo: -5:-2}
上面例子中,offset
为-5
,表示从倒数第5个字符开始截取,所以返回long.
。如果指定长度length
为2
,则返回lo
;如果length
为-2
,表示要排除从字符串末尾开始的2个字符,所以返回lon
:
3.搜索和替换
Bash 提供字符串搜索和替换的多种方法。
(1)字符串头部的模式匹配。
以下两种语法可以检查字符串开头,是否匹配给定的模式。如果匹配成功,就删除匹配的部分,返回剩下的部分。原始变量不会发生变化。
# 如果 pattern 匹配变量 variable 的开头,
# 删除最短匹配(非贪婪匹配)的部分,返回剩余部分
${variable#pattern}
# 如果 pattern 匹配变量 variable 的开头,
# 删除最长匹配(贪婪匹配)的部分,返回剩余部分
${variable##pattern}
上面两种语法会删除变量字符串开头的匹配部分(将其替换为空),返回剩下的部分。区别是一个是最短匹配(又称非贪婪匹配),另一个是最长匹配(又称贪婪匹配)。
匹配模式pattern
可以使用*
、?
、[]
等通配符。
myPath=/home/cam/book/long.file.name
echo ${myPath#/*/}
echo ${myPath##/*/}
上面例子中,匹配的模式是/*/
,其中*
可以匹配任意数量的字符,所以最短匹配是/home/
,最长匹配是/home/cam/book/
:
下面写法可以删除文件路径的目录部分,只留下文件名。
path=/home/cam/book/long.file.name
echo ${path##*/}
上面例子中,模式*/
匹配目录部分,所以只返回文件名: