-
功能介绍
字符串的截取是在一个长的字符串中提取其中一部分,解决从什么位置开始朝什么方向(通常向右)截取多大长度的子串问题。
例如: var="ABCDEF"; 从var的位置2(从0开始计数)开始截取长度为3的字符串,结果为"CDE"。
-
语法格式
序号 | 格式 | 说明 |
---|---|---|
1 | ${string: start :length} | 从 string 字符串的左边第 start 个字符开始,向右截取 length 个字符。 |
2 | ${string: start} | 从 string 字符串的左边第 start 个字符开始截取,直到最后。 |
3 | ${string: 0-start :length} | 从 string 字符串的右边第 start 个字符开始,向右截取 length 个字符。 |
4 | ${string: 0-start} | 从 string 字符串的右边第 start 个字符开始截取,直到最后。 |
5 | ${string#*chars} | 从 string 字符串第一次出现 *chars 的位置开始,截取 *chars 右边的所有字符。 *chars表示匹配左边,功能理解为匹配删除掉,截取剩余的部分,所以右侧。 |
6 | ${string##*chars} | 从 string 字符串最后一次出现 *chars 的位置开始,截取 *chars 右边的所有字符。 两个##表示#贪婪,最大匹配 |
7 | ${string%chars*} | 从 string 字符串第一次出现 *chars 的位置开始,截取 chars* 左边的所有字符。 |
8 | ${string%%chars*} | 从 string 字符串最后一次出现 *chars 的位置开始,截取 chars* 左边的所有字符。 两个%%表示%贪婪,最大匹配 |
备注:
-
实例
1. ${string: start :length}
从 string 字符串的左边第 start 个字符开始,向右截取 length 个字符。
start表示左侧开始第start个,start是从0开始计算。 length表示字符的个数。
renhl@verygood:~$ var="ABCDEF"; echo ${var:0:1} # 序号0 开始,长度1
A
renhl@verygood:~$ var="ABCDEF"; echo ${var:1:1} # 序号1 开始,长度1
B
renhl@verygood:~$ var="ABCDEF"; echo ${var:5:1} # 序号5 开始,长度1
F
renhl@verygood:~$ var="ABCDEF"; echo ${var:6:1} # 序号6 开始,长度1 超出字符串var长度
renhl@verygood:~$ var="ABCDEF"; echo ${var:0:2} # 序号0 开始,长度2
AB
renhl@verygood:~$ var="ABCDEF"; echo ${var:5:2} # 序号5 开始,长度2 长度2超出字符串var长度
F
renhl@verygood:~$
2. ${string: start}
从 string 字符串的左边第 start 个字符开始截取,直到最后。
start表示左侧开始第start个,start是从0开始计算。截取长度为右侧剩余的字符串的长度。
renhl@verygood:~$ var="ABCDEF"; echo ${var:0} # 序号0 长度序号右侧包含序号字符
ABCDEF
renhl@verygood:~$ var="ABCDEF"; echo ${var:1} # 序号1 长度序号右侧包含序号字符
BCDEF
renhl@verygood:~$ var="ABCDEF"; echo ${var:5} # 序号5 长度序号右侧包含序号字符
F
renhl@verygood:~$ var="ABCDEF"; echo ${var:6} # 序号6 长度序号右侧包含序号字符,序号var超出长度
renhl@verygood:~$
3. ${string: 0-start :length}
从 string 字符串的左边第 0-start 个字符开始,向右截取 length 个字符。
0-start表示右侧开始第start个,start是从1开始计算。 length表示字符的个数。
renhl@verygood:~$ var="ABCDEF"; echo ${var:0-1:1} #序号0-1,长度为1
F
renhl@verygood:~$ var="ABCDEF"; echo ${var:0-2:1} #序号0-2,长度为1
E
renhl@verygood:~$ var="ABCDEF"; echo ${var:0-6:1} #序号0-6,长度为1
A
renhl@verygood:~$ var="ABCDEF"; echo ${var:0-7:1} #序号0-7,长度为1 超出范围
renhl@verygood:~$ var="ABCDEF"; echo ${var:0-2:2} #序号0-2,长度为2,取得右侧字符串
EF
renhl@verygood:~$ var="ABCDEF"; echo ${var:0-3:2} #序号0-3,长度为2,取得右侧字符串
DE
renhl@verygood:~$
4. ${string: 0-start}
从 string 字符串的右边第 start 个字符开始截取,直到最后。
0-start表示右侧开始第start个,start是从1开始计算。 截取长度为右侧剩余的字符串的长度。
renhl@verygood:~$ var="ABCDEF"; echo ${var:0-1} # 序号0-1 长度序号右侧包含序号字符
F
renhl@verygood:~$ var="ABCDEF"; echo ${var:0-5} # 序号0-5 长度序号右侧包含序号字符
BCDEF
renhl@verygood:~$ var="ABCDEF"; echo ${var:0-6} # 序号0-6 长度序号右侧包含序号字符
ABCDEF
renhl@verygood:~$ var="ABCDEF"; echo ${var:0-7} # 序号0-7 由于-7超出序号范围,显示为空
renhl@verygood:~$
5. ${string#*chars}
从 string 字符串第一次出现 *chars 的位置开始,截取 *chars 右边的所有字符。
*chars表示匹配左边,功能理解为匹配删除掉,截取剩余的部分,所以右侧。
renhl@verygood:~$ var="AB12CD12EF12GH"; echo ${var#*12} #左侧开始第一次出现12,截取12右侧所有字符
CD12EF12GH
6. ${string##*chars}
从 string 字符串最后一次出现 *chars 的位置开始,截取 *chars 右边的所有字符。
两个##表示#贪婪,最大匹配
renhl@verygood:~$ var="AB12CD12EF12GH"; echo ${var##*12} # 左侧开始搜索最后12的位置,截取位置右侧的字符串
GH
renhl@verygood:~$
7. ${string%chars*}
从 string 字符串第一次出现 *chars 的位置开始,截取 chars* 左边的所有字符。
renhl@verygood:~$ var="AB12CD12EF12GH"; echo ${var%12*} # 右侧开始搜索第一个12的位置,截取位置左侧的字符串
AB12CD12EF
8. ${string%%chars*}
从 string 字符串最后一次出现 *chars 的位置开始,截取 chars* 左边的所有字符。
两个%%表示%贪婪,最大匹配
renhl@verygood:~$ var="AB12CD12EF12GH"; echo ${var%%12*} # 右侧开始搜索最后一个12的位置,截取位置左侧的字符串
AB
renhl@verygood:~$