跳到主要内容

[toc]

shell变量子串

1.返回变量

${var} 返回变量var的内容

$ a=10
$ echo ${a}
10

2.返回字符长度

${#var} 返回变量var的长度,按照字符

a=10
$ echo ${#a}
2

3.截取子串

${var:n} 在变量var中,从位置n(n为数字)之后开始提取子串到结尾

$ a="i am boy"
$ echo ${a:3}
m boy

${var:n:length} 在变量var中,从位置n之后开始提取长度为length的子串

$ a="i am boy"
$ echo ${a:3:3}
m b

4.删除子串

4.1 从开头删除

4.1.1 最短匹配

${var#word} 从变量var开头开始删除最短匹配的word子串

$ a=abc123ABCabc123ABC
$ echo ${a#a*b}
c123ABCabc123ABC #匹配了ab,最短匹配
$ echo ${a#a*C}
abc123ABC #匹配了abc123ABC

4.1.2 最长匹配

${var##word} 从变量var开头开始删除最长匹配的word子串

$ a=abc123ABCabc123ABC
$ echo ${a##a*b}
c123ABC #匹配了abc123ABCab,最长匹配
$ echo ${a##a*C}
#全部匹配,全部删除

4.2 从结尾删除

4.2.1 最短匹配

${var%word} 从变量var结尾开始删除最短匹配的word子串

$ a=abc123ABCabc123ABC
$ echo ${a%1*C}
abc123ABCabc #从结尾开始匹配了123ABC

4.2.2 最长匹配

${var%%word} 从变量var结尾开始删除最长匹配的word子串

$ a=abc123ABCabc123ABC
$ echo ${a%%1*C}
abc #从结尾匹配了123ABCabc123ABC

5.替换子串

${var/A/B} 用B代替第一个匹配的A

$ a=abc111
$ echo ${a/1/9}
abc911

${var//A/B} 用B代替所有匹配的A

$ a=abc111
$ echo ${a//1/9}
abc999

6.特殊扩展变量

6.1 ${var:-word}

${var:-word} ,冒号可以忽略 如果var的变量值为空或为未赋值,则会返回word字符串并替代变量的值

$ echo $C
#变量C没有赋值,所以为空
$ B=${C:-hehe} #如果C没有赋值,则将hehe赋值给B
$ echo $B
hehe

$ A=abc
$ B=${A:-haha} #因为变量A有值,所以将变量A的值赋予B
$ echo $B
abc

#冒号可以不写
$ echo $D

$ E=${D-hehe}
$ echo $E
hehe

6.2 ${var:=word}

${var:=word},冒号可以忽略 如果var的变量值为空或未赋值,则设置这个变量值为word,并返回其值

$ echo $A
#变量A没有赋值
$ B=${A=hehe} #如果变量A为空或未赋值,则设置变量A的值为hehe
$ echo $A
hehe #与var-word不同,变量A也会有值
$ echo $B
hehe

6.3 ${var:?word}

${var:?word} ,冒号可以忽略 如果var的变量值为空或未赋值,那么word字符串将被作为标准错误输出,否则输出变量的值

$ echo $A		
#变量A为空或未赋值
$ echo ${A?hehe}
-bash: A: hehe #将hehe作为标准错误输出

$ A=abc
$ echo ${A?hehe}
abc #因为变量A有值,所以输出变量A的值

6.4 ${var:+word}

${vrt:+word} ,冒号可以忽略 如果var变量值为空或未赋值,则什么都不做,否则word字符串将替代变量的值

$ echo $A
#变量A为空或未赋值
$ echo ${A+hehe}
#不做任何操作

$ A=abc
$ echo ${A+hehe}
hehe #因为变量A有值,所以用hehe替代变量A的值