前言
此系列为慕课网《跟着360架构师 学习Shell脚本编程》的学习笔记,与菜鸟教程中的 Shell 教程 搭配食用效果更佳。
删除与替换
语法说明
语法 | 说明 |
---|---|
${变量名#匹配规则} | 从变量开头匹配,将符合最短的数据删除 |
${变量名##匹配规则} | 从变量开头匹配,将符合最长的数据删除 |
${变量名%匹配规则} | 从变量尾部匹配,将符合最短的数据删除 |
${变量名%%匹配规则} | 从变量尾部匹配,将符合最长的数据删除 |
${变量名/旧字符串/新字符串} | 变量内容符合旧字符串规则,让第一个旧字符串被新字符串替代 |
${变量名//旧字符串/新字符串} | 变量内容符合旧字符串规则,让全部的旧字符串被新字符串替代 |
[#]
root@localhost:01# str="hello world"
root@localhost:01# echo ${str#wor}
# 说明:
# 类似Python中的re.match(),必须从第一个字符开始挨个匹配,如果途遇不能匹配字符,
# 那么匹配失败,所以删除空。也可认为原字符串什么都没删除。
hello world
root@localhost:01# echo ${str#hel*}
# 说明:
# `*`可以匹配任意字符,
# 一个`#`表示关闭贪婪,尽量少的匹配,所以只有`hel`被删除
lo world
root@localhost:01# echo ${str##hel*}
# 说明:
# 两个`#`表示开启贪婪,尽可能多的匹配,字符串全被删除,所以输出空
root@localhost:01# ...
[%]
与#
类似,不过前者从字符串头开始匹配,%
表示从字符串尾开始匹配。匹配结束之后都要做删除操作。
root@localhost:01# str="hello world"
root@localhost:01# echo ${str%rrld}
hello world
root@localhost:01# echo ${str%rld}
hello wo
root@localhost:01# echo ${str%*rld}
# 说明:
# 一个`%`表示关闭贪婪
hello wo
root@localhost:01# echo ${str%%*rld}
# 说明:
# 两个`%`表示开启贪婪
root@localhost:01# ...
[/]
可以认为一个/
是非贪婪,两个//
是贪婪;但更好的理解方式是前者看作Python中的re.search()
,后者看作Python中的re.findall()
root@localhost:01# str="hello world"
root@localhost:01# echo ${str/l/-}
# 说明:
# 在`str`中寻找`l`,找到第一个就停止,
# 再用`-`替换`str`中的`l`
he-lo world
root@localhost:01# echo ${str//l/-}
# 说明:
# 找出`str`中所有`l`,再用`-`替换这些`l`
he--o wor-d
root@localhost:01# ...
字符串长
语法说明
语法 | 说明 |
---|---|
${#str} | 返回字符串长度 |
expr length "$str" | 如果str表示的字符串有空格,必须加双引号 |
示例
root@localhost:01# str="hello world"
root@localhost:01# echo ${#str}
11
root@localhost:01# expr length "$str"
11
root@localhost:01# strlen=${#str}
# 说明: `${#...}`允许直接赋值给变量
root@localhost:01# strlen=`expr length "$str"`
# 说明: `expr length`方式必须用反引号包起来,才可以赋值给变量
字符位置
语法说明
语法 | 说明 |
---|---|
expr index "$str" str2 | 如果在str2中的字符也在str中,输出最近字符的位置 |
expr match "$str" str2 | 从头开始匹配子字符串,输出匹配到的字符个数,匹配不到返回0 |
expr substr "$str" pos len | pos表示位置,意为:从pos开始,返回len个字符 |
expr index
expr index
的处理方式是,将str2中所有字符拆分开,这些被拆分出来的字符拿到str中匹配,输出在str中、从左到右、最先出现的字符的位置。注意是位置,不是索引,一般认为:位置 = 索引 + 1。
因此下面的示例中,无论是lok还是kol,得到结果相同。
root@localhost:01# str="hello world"
root@localhost:01# expr index "$str" lok
3
root@localhost:01# expr index "$str" kol
3
root@localhost:01# expr index "$str" k
0 # 说明:如果不存在,输出0
expr match
表示从左到右、一个接一个的匹配字符,如果str2中所有字符得到正确匹配,输出str2的长度(也就是匹配的字符的个数);如果存在至少一个字符不能被正确匹配,输出0。
root@localhost:01# str="hello world"
root@localhost:01# expr match "$str" hell
4
root@localhost:01# expr match "$str" hellk
0 # `k`不能正确匹配,输出0
root@localhost:01# expr match "$str" "hello "
6 # 说明:如果想匹配原字符串的空格,可对str2用引号包起来
expr substr
截取字符串,pos
表示从哪个位置的字符开始截取,len
表示截取多少个字符。
root@localhost:01# str="hello world"
root@localhost:01# expr substr "$str" 2 6
ello w
root@localhost:01# expr substr "$str" 2 100
ello world # 说明:len超过原字符串长度不会报错
root@localhost:01# expr substr "$str" 100 100
# 说明:输出空
截取字符串
语法说明
语法 | 说明 |
---|---|
${str:start} | start为索引值,表示从索引start开始匹配,直到字符串结束 |
${str:start:len} | 表示从索引start开始,匹配len个字符 |
${str: -start} | 字符串最后一个字符索引为-1,倒数第二个为-2,依次;注意冒号后面有空格 |
${str:(-start)} | 用括号“()”可不写冒号后面的空格 |
示例
${:}
方式截取字符串类似Python中的切片,start表示索引值。
root@localhost:01# str="hello world"
root@localhost:01# echo ${str:4}
o world
root@localhost:01# echo ${str:4:4}
o wo
root@localhost:01# echo ${str: -3:2}
rl # 说明:注意冒号后面的空格不能省略
root@localhost:01# echo ${str:(-3):2}
rl # 说明:有括号之后就不需要空格了
还不快抢沙发