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}