1、基于模式匹配截取字符串
1、#、##号截取
#号截取,从左边开始,以一个出现的分隔符(最左)为准,删除左边字符。
##号截取,从左边开始,以最后(最右)一个分隔符为准,删除左边字符。
str='hello world' echo ${str#*l} echo ${str##*l}
echo ${str##*llo}
#*l 表示从左边开始删除第一个出现的w左边的所有字符。##*l 表示从左边开始删除最后一个出现的w左边的所有字符。
2、%、%%号截取
%号截取,从右边开始,以一个出现的分隔符(最右)为准,删除右边字符。
%%号截取,从右边开始,以最后一个出现的分隔符(最左)为准,删除右边字符。
str='hello world' echo ${str%l*} echo ${str%%l*}
echo ${str%lo*}
%l* 表示从右边开始删除第一个出现的w右边的所有字符。%%l* 表示从右边开始删除最后一个出现的w右边的所有字符。
2、字符串切片
字符串切片:${var:offset:length}
1、当length为正数时:
str='hello world' echo ${str:0:7} #从第0个字符开始,截取7个字符。 echo ${str:7} #从左边开始第七个字符,一直到结束。 echo ${str:0-7:2} #从右边开始第七个字符,截取2个字符。 echo ${str:0-7:3} #从右边开始第七个字符,截取3个字符。 echo ${str:0-7} #从右边开始第七个字符,一直到结束。
2、当length为负数时:
str='hello world' echo ${str:0:-2} #从第0个字符开始,一直到倒数第二个字符。 echo ${str:0-7:-2} #从右往作数的第七个字符开始,一直到倒数第二个字符。 echo ${str:4:-2} #从第四个字符开始,一直到倒数第二个字符。 echo ${str: -2} #从右边开始(倒数)第二个字符,一直到最后。注意冒号后有空格,等效于${str:0-2}。
3、查找替换字符串
${var/pattern/substi}:查找var所表示的字串中,第一次被Pattern匹配到的字串,并以substi替换之。
${var//patten/substi}:查找var所表示的字串中,所有被Pattern匹配到的字串,并以substi替换之。
${var/#pattern/substi}:以行首锚定的方式将pattern匹配至var所表示的字串上,如果能匹配,则以substi替换之。
${var/%pattern/substi}:以行尾锚定的方式将pattern匹配至var所表示的字串上,如果能匹配,则以substi替换之。
以上均可使用?, *元字符。
str='hello world' echo ${str/l/e} echo ${str//l/e} echo ${str/#l/e}
echo ${str/#hel/e}
echo ${str/%ld/e}
echo ${str/h*o/hi}
echo ${str/h??/eee}
${var/pattern}:替换为空,即删除pattern匹配到的第一次出现。
${var//pattern}: 删除pattern匹配到的所有出现。
${var/#pattern}
${var/%pattern}
使用方法同上。
4、字符串大小写转换
${var^^}:小写-->大写
${var,,}:大写-->小写
str='hello WORLD' echo ${str^^} echo $str | tr '[a-z]' '[A-Z]' echo ${str,,} echo $str | tr '[A-Z]' '[a-z]'
大小写转换的方式很多,还包括 declare、awk等。
5、变量赋值
${var:-word}: 如果var为空或未设置,那么返回word;否则,则返回var中的值;
${var:=word}:如果var为空或未设置,那么返回word,并且将word赋值给var;否则,返回var中的值;
${var:?err_info}:如果var为空或未设置,那么返回错误信息;否则,则返回var自身的值;
${var:+word}:如果var自身有正常数据,则返回word;
str='hello world' echo ${str:-word} str='' echo ${str:-word} echo ${str:=word} echo $str echo ${str:?error} str='' echo ${str:?error} echo $? #查看上条命令是否返回错误信息 echo ${str:+word} str='asdas' echo ${str:+word}