shell变量子串
通过man bash 搜索parameter expansion
先定义一个变量名为DAIDAI,注意变量名是大写,如图所示:
我这样直接echo变量名是直接调用赋值
①显示变量值中的字符串的长度:
[root@6 scripts]# echo ${#DAIDAI}
变量中自带的计算长度的防范效率最高,在要求效率的场景下多使用!
②变量子串截取
打印指定开始位置的字符串长度,I am daidai这里我从第三个字符开始打印(包含空格且不算第三个字符)
[root@6 scripts]# echo ${DAIDAI:3}
也可以制定从哪个字段开始取,取多少字段,
[root@6 scripts]# DAIDAI="I am daidai"
[root@6 scripts]# echo ${DAIDAI:2:2}
③从变量DAIDAI从开头删除最短匹配的子串
这里我从开头删除了I am
[root@6 scripts]# echo ${DAIDAI#I am}
输出显示就这是剩下了daidai了。
#表示从开头删除匹配最短。
④从变量DAIDAI从开头删除最长匹配的子串
[root@6 scripts]# DAIDAI="abcABC123abc"
[root@6 scripts]# echo $DAIDAI
abcABC123abc
[root@6 scripts]# echo ${DAIDAI##a*c}
从开头删除最长匹配a*c的子串,如图所示:结果为空了,说明都是匹配上了,全部删除。
a*c表示匹配的字符串,*表示匹配所有,a*c匹配开头为a,中间为任意多个字符,结尾为c的字符串。
[root@6 scripts]# DAIDAI="abcABC123abc"
[root@6 scripts]# echo $DAIDAI
abcABC123abc
[root@6 scripts]# echo ${DAIDAI##a*C}
123abc
如图所示:从开头删除的最长匹配字符a*C ,结果很明显,如图所示:
##表示从开头删除匹配最长。
a*C表示匹配的字符串,*表示匹配所有,a*C匹配开头为a,中间为任意多个字符,结尾为C的字符串。
⑤从变量DAIDAI结尾开始删除最短匹配的子串。
[root@6 scripts]# echo ${DAIDAI%daidai}
如图所示:开头保留了,只删除结尾。
%表示从结尾删除匹配最短。
⑥从变量DAIDAI结尾开始删除最长匹配的子串
[root@6 scripts]# DAIDAI="I am daidai"
[root@6 scripts]# echo ${DAIDAI%%i*i}
I am da
如图所示:从结尾删除了最长匹配的子串
%%表示从结尾删除匹配最长。
⑦使用/代替第一个指定匹配的字符并替换。(用的比较多)
[root@6 scripts]# DAIDAI="I am daidai"
[root@6 scripts]# echo $DAIDAI
I am daidai
[root@6 scripts]# echo ${DAIDAI/daidai/aimi}
I am aimi
⑧使用//代替所有匹配的指定字符串
[root@6 scripts]# DAIDAI="I am daidai,yes daidai"
[root@6 scripts]# echo $DAIDAI
I am daidai,yes daidai
[root@6 scripts]# echo ${DAIDAI//daidai/niuniu}
I am niuniu,yes niuniu
如图所示:替换了所有匹配daidai的字符串。
有关上述匹配删除总结:
#表示从开头删除匹配最短。
##表示从开头删除匹配最长。
%表示从结尾删除匹配最短。
%%表示从结尾删除匹配最长。
a*c表示匹配的字符串,*表示匹配所有,a*c匹配开头为a,中间为任意多个字符,结尾为c的字符串。
a*C表示匹配的字符串,*表示匹配所有,a*C匹配开头为a,中间为任意多个字符,结尾为C的字符串。