1.字符串切片

${#VAR}:返回字符串类型的变量VAR的长度

[root@test ~]# a=abcd
[root@test ~]# echo ${#a}
4

${VAR:offset}:返回字符串变量VAR中第offset个字符后面的内容,不包括第offset个字符(offset叫做偏移量)

offset的取值范围为:0-$[${#VAR}-1]

[root@test ~]# a=abcd
[root@test ~]# echo ${a:2}
cd

${VAR:offset:number}:返回字符串变量VAR中从第offset个字符后开始,长度为number的字符部分

[root@test ~]# a=abcd
[root@test ~]# echo ${a:2:1}
c

${VAR: -length}:取整个字符串最右侧的length个字符

[root@test ~]# a=abcd
[root@test ~]# echo ${a: -1}
d

注意:在“a:”和“-1”之间有空格


2.基于模式取字串

${VAR#*PATTERN}:自左而右,查找VAR变量所存储的字符串中,第一次被PATTNERN匹配的字符,删除从字符串开始到PATTNERN匹配的字符之间的所有字符(*号表示通配符的意思)

找到第一个匹配到的字符,然后删除当前字符和之前的所有

按照字符匹配

[root@test ~]# a=bcbcdede
[root@test ~]# echo ${a#*c}
bcdede

或者按照模式匹配

[root@test ~]# a=a1df
[root@test ~]# echo ${a#*[[:digit:]]}
df

模式可以是grep命令能够匹配的内容,以下PATTERN都是,就不一一列举了

${VAR##*PATTERN}:自左而右,查找VAR变量所存储的字符串中,所有被PATTNERN匹配的字符,删除从字符串开始到PATTNERN匹配的字符之间的所有字符

[root@test ~]# a=bcbcdede
[root@test ~]# echo ${a##*c}
dede

${VAR%PATTERN*}:自右而左,查找VAR变量所存储的字符串中,第一次被PATTNERN匹配的字符,删除从字符串结尾到PATTNERN匹配的字符之间的所有字符

[root@test ~]# a=bcbcdede
[root@test ~]# echo ${a%e*}
bcbcded

${VAR%%PATTERN*}:自右而左,查找VAR变量所存储的字符串中,所有被PATTNERN匹配的字符,删除从字符串结尾到PATTNERN匹配的字符之间的所有字符

[root@test ~]# a=bcbcdede
[root@test ~]# echo ${a%%e*}
bcbcd


3.查找替换

${VAR/PATTERN/SUBSTRING}:在VAR变量中查找匹配PATTNERN的内容,将其第一个匹配到的结果更换成SUBSTRING

[root@test ~]# a=2b2b2b
[root@test ~]# echo ${a/[[:digit:]]/a}
ab2b2b

${VAR//PATTERN/SUBSTRING}:在VAR变量中查找匹配PATTNERN的内容,将所有匹配到的结果更换成SUBSTRING

[root@test ~]# a=2b2b2b
[root@test ~]# echo ${a//[[:digit:]]/a}
ababab

${VAR/#PATTERN/SUBSTRING}:在VAR变量中查找行首匹配PATTNERN的内容,将匹配的结果更换成SUBSTRING

[root@test ~]# a=b2b2b2
[root@test ~]# echo ${a/#[[:digit:]]/a}
b2b2b2

${VAR/%PATTERN/SUBSTRING}:在VAR变量中查找行尾匹配PATTNERN的内容,将匹配的结果更换成SUBSTRING

[root@test ~]# a=b2b2b2
[root@test ~]# echo ${a/%[[:digit:]]/a}
b2b2ba


4.查找删除

${VAR/PATTERN}:在VAR变量中查找匹配PATTNERN的内容,将其第一个匹配到的结果删除

[root@test ~]# a=b2b2b2
[root@test ~]# echo ${a/[[:digit:]]}
bb2b2

${VAR//PATTERN}:在VAR变量中查找匹配PATTNERN的内容,将所有匹配到的结果删除

[root@test ~]# a=b2b2b2
[root@test ~]# echo ${a//[[:digit:]]}
bbb

${VAR/#PATTERN}:在VAR变量中查找匹配PATTNERN的内容,将其行首匹配到的结果删除

[root@test ~]# a=2b2b2b
[root@test ~]# echo ${a/#[[:digit:]]}
b2b2b

${VAR/%PATTERN}:在VAR变量中查找匹配PATTNERN的内容,将其行尾匹配到的结果删除

[root@test ~]# a=b2b2b2
[root@test ~]# echo ${a/%[[:digit:]]}
b2b2b


5.字符的大小写转换

${VAR^^}:将VAR变量中的所有小写字母转换为大写字母

[root@test ~]# a=abc
[root@test ~]# echo ${a^^}
ABC

${VAR,,}:将VAR变量中的所有大小字母转换为小写字母

[root@test ~]# a=ABC
[root@test ~]# echo ${a,,}
abc


6.变量赋值

${VAR:-value}:如果变量为空或未被设置,那么直接返回value的值,否则返回变量VAR的值

[root@test ~]# a=abc
[root@test ~]# echo ${a:-def}
abc
[root@test ~]# echo ${b:-def}
def

${VAR:+value}:如果变量不为空,那么直接返回value的值

[root@test ~]# a=abc
[root@test ~]# echo ${a:+def}
def
[root@test ~]# echo ${b:+def}

[root@test ~]# echo $a
abc

${VAR:=value}:如果变量为空或未被设置,那么直接返回value的值,并且将value的值赋值给VAR,否则返回变量VAR的值

[root@test ~]# a=abc
[root@test ~]# echo ${a:=def}
abc
[root@test ~]# echo $a
abc
[root@test ~]# echo $b
[root@test ~]# echo ${b:=def}
def
[root@test ~]# echo $b
def


7.变量的间接引用

如果第一个变量的值恰好是第二个变量的变量名,从第一个变量引用第二个变量的值的方法,就称为间接变量引用

VAR1=VAR2

VAR2=value

bash提供了两种格式的间接变量引用方式

1)eval MYVAR=\$$VAR1==> \$VAR2

[root@test ~]# echo $a
b
[root@test ~]# echo $b
def
[root@test ~]# eval c=\$$a
[root@test ~]# echo $c
def


2)MYVAR=${!VAR1}

[root@test ~]# echo $a
b
[root@test ~]# echo $b
def
[root@test ~]# echo ${!a}
def