Bash对字符串的处理
注意:文章中提到的替换,并不改变实际变量的值,只是基于原来的变量做一些运算,输出结果而已。
-
字符串长度:${#str}# echo ${#strs}12
或者,awk中使用length系统函数
# awk -v strs=$strs 'END{print length(strs)}' /dev/null12
或者,expr中使用length命令# expr length $strs12
或者,python中使用len属性>>> len(strs)12
-
求子串,特定段的字符串:${str:index:length}
求第2个字符开始步长为3:
echo ${strs:1:3}1x1注意:如果是反向取,如取倒数第三个开始到末尾,${strs:-(3)},不是${strs:-3}。
# echo ${strs:(-3)}x1x
-
求子串,通用的做法
建议awk的的 substr命令来实现
substr(s, i [, n]) Returns the at most n-character substring of s starting at i. If n is omitted, the rest of s is used.(man awk)
使用的场景极少。 -
掐头去尾
掐头,去掉前边的x1x12:echo ${strs/*12}
y2y1x1x
去尾,去掉后从12开始的所有字符:# echo ${strs/12*}x1x
注意:如果想明确标示去掉开头或结尾的某几个字符,则需要使用${strs/#str1}或${strs/%str1}。
# echo ${strs/#x1x/}12y2y1x1x[root@localhost ~]# echo ${strs/%x1x/}x1x12y2y1
-
字符替换与掐头去尾类似。可以使用${strs/str1/str2}或${strs//str1/str2}来完成,可以把掐头去尾当作是字符替换的特例,在这里分别表示自左向右,替换str1为str2一次和替换所有的str1为str2。如果明确标示匹配的方向,需要用${strs/#str1/str2}或${strs/%str1/str2}代替,分别表示 自左向右匹配后替换,自右向左匹配后替换。[root@localhost ~]# echo ${strs/#x1x/555}55512y2y1x1x[root@localhost ~]# echo ${strs/%x1x/555}x1x12y2y1555
-
是否初始化或为空:${strs-str1}或${str:-str1}对于一个未初始化的变量,和一个值为空的变量在脚本中一般不做区分,但是难免会有极端的情况。${strs-str1}或${str:-str1},前者表示如果变量strs未初始化,则运算结果替换为str1;后者表示如果strs变量为空时,则运算结果替换为str1。
有这样一个变量 unint
看一下这两个值:${unint:-未初始化或值为空} 和 ${unint-未初始化或值为空}
[root@localhost ~]# echo ${unint:-未初始化或值为空}
-
未初始化或值为空[root@localhost ~]# echo ${unint-未初始化或值为空}未初始化或值为空现在我们把unint换成inted,初始化它为空串
inted=""
[root@localhost ~]# echo ${inted-未初始化}[root@localhost ~]# echo ${inted:-为空}
为空