shell字符串替换语法

1.几种特殊的替换结构:

${var:-string},${var:+string},${var:=string},${var:?string}

(1)${var:-string} 和 ${var:=string}
若变量var为空或者未定义,则用在命令行中用string来替换${var:-string}
否则变量var不为空时,则用变量var的值来替换${var:-string}
[root@localhost b21430]# echo $a

[root@localhost b21430]# echo ${a:-bcc}
bcc
[root@localhost b21430]# echo $a

[root@localhost b21430]#  a=ajax
[root@localhost b21430]# echo $a
ajax
[root@localhost b21430]# echo ${a:-bcc}
ajax
[root@localhost b21430]# echo $a
ajax
[root@localhost b21430]# unset a
[root@localhost b21430]# echo $a

[root@localhost b21430]# echo ${a:=bbc}
bbc
[root@localhost b21430]# echo $a
bbc
[root@localhost b21430]# echo ${a:=kkk}
bbc
[root@localhost b21430]# echo $a
bbc

${var:=string}:$var为空时,把string赋值给了var和${var:=string},不为空时string不起作用,var和${var:=string}的值都为var;${var:-string}:$var为空或不为空时,string均不会改变var的值,$var为空时,${var:-string}值为string值,$var不为空时,${var:-string}值为var值(2) ${var:+string}
规则和上面的完全相反
即只有当var不是空的时候才替换成string,若var为空时则不替换或者说是替换成变量var的值,即空值
[root@bogon ~]# a=ajax
[root@bogon ~]# echo $a
ajax
[root@bogon ~]# echo ${a:+bbc}
bbc
[root@bogon ~]# echo $a
ajax
[root@bogon ~]# unset a
[root@bogon ~]# echo $a

[root@bogon ~]# echo ${a:+bbc}

[root@bogon ~]# 

(3). ${var:?string}
替换规则:若变量var不为空,则用变量var的值来替换${var:?string}
若变量var为空,则把string输出到标准错误中,并从脚本中退出。
可利用此特性来检查是否设置了变量的值

[root@bogon ~]# echo $a

[root@bogon ~]# echo ${a:?bbc}
-bash: a: bbc
[root@bogon ~]# a=ajax
[root@bogon ~]# echo ${a:?bbc}
ajax
[root@bogon ~]# a=ajax
[root@bogon ~]# echo ${a:-`date`}
ajax
[root@bogon ~]# unset a
[root@bogon ~]# echo ${a:-`date`}
2017年 02月 21日 星期二 10:13:46 CST
[root@bogon ~]# echo ${a:-$(date)}
2017年 02月 21日 星期二 10:13:59 CST
[root@bogon ~]# b=bbc
[root@bogon ~]# echo ${a:-$b}
bbc

2.四种模式匹配替换结构:

${var%pattern}
${var%%pattern}
${var#pattern}
${var##pattern}

${var%pattern},${var%%pattern} 从右边开始匹配
${var#pattern},${var##pattern} 从左边开始匹配
${var%pattern} ,${var#pattern} 表示最短匹配,匹配到就停止,非贪婪
${var%%pattern},${var##pattern} 是最长匹配

只有在pattern中使用了通配符才能有最长最短的匹配,否则没有最 长最短匹配之分
结构中的pattern支持通配符
* 表示零个或多个任意字符
?表示零个或一个任意字符
[...]表示匹配中括号里面的字符
[!...]表示不匹配中括号里面的字符

[root@bogon ~]# f=a.tar.gz
[root@bogon ~]# echo ${f##*.}
gz
[root@bogon ~]# echo ${f%%.*}
a
[root@bogon ~]# var=abcdccbbdaa
[root@bogon ~]# echo ${var%%d*}
abc
[root@bogon ~]# echo ${var%d*}
abcdccbb
[root@bogon ~]# echo ${var#*d}
ccbbdaa
[root@bogon ~]# echo ${var##*d}
aa
#发现输出的内容是var去掉pattern的那部分字符串的值

猜你喜欢

转载自blog.csdn.net/qq_29044159/article/details/108306225