本文转自:http://blog.csdn.net/chaofanwei/article/details/17377451
本文会做少量改动。
一:判断读取字符串值
表达式 含义
${var} 变量var的值, 与$var相同
${var-DEFAULT} 如果var没有被声明, 那么就以DEFAULT作为其值
${var:-DEFAULT} 如果var没有被声明, 或者其值为空, 那么就以DEFAULT作为其值
${var=DEFAULT} 如果var没有被声明, 那么就以DEFAULT作为其值 ,还会把DEFAULT赋值给var
${var:=DEFAULT} 如果var没有被声明, 或者其值为空, 那么就以DEFAULT作为其值,还会把DEFAULT赋值给var
${var+OTHER} 如果var声明了, 那么其值就是OTHER, 否则就为null字符串
${var:+OTHER} 如果var被设置了, 那么其值就是OTHER, 否则就为null字符串
${var?ERR_MSG} 如果var没被声明, 那么就打印ERR_MSG
${var:?ERR_MSG} 如果var没被设置, 那么就打印ERR_MSG
${!varprefix*} 匹配之前所有以varprefix开头进行声明的变量
${!varprefix@} 匹配之前所有以varprefix开头进行声明的变量
实例1:${var-DEFAULT}
[root@cong-55 tmp]# cat test.sh #!/bin/bash # var="abcdef" ##声明变量var var1="" ##声明变量,var1,但是值是空的。但是如果这样赋值 var1=" ",居然认为不是空值。 echo "${var-testvar}" echo "${var1-testvar1}" echo "${var2-testvar2}" [root@cong-55 tmp]# sh /tmp/test.sh abcdef ##因为有声明var变量,所以直接打印了var的值 ##因为有声明var1变量,所以直接打印了var1的值 testvar ##没有声明var2变量,所以打印了testvar2字符串。 [root@cong-55 tmp]#
实例2:${var:-DEFAULT}
[root@cong-55 tmp]# cat test.sh #!/bin/bash # var="abcdef" var1="" echo "${var:-testvar}" echo "${var1:-testvar1}" echo "${var2:-testvar2}" [root@cong-55 tmp]# sh test.sh abcdef ##因为var有声明定义,所以直接打印var的值 testvar1 ##因为var1的值为空值,所以打印tetvar1字符串 testvar2 ####因为var2的值为空值,所以打印tetvar2字符串 [root@cong-55 tmp]#
实例3:${var=DEFAULT}
[root@cong-55 tmp]# cat test.sh #!/bin/bash # var="abcdef" var1="" echo "${var=testvar}" echo "${var1=testvar1}" echo "${var2=testvar2}" echo "${var2}" [root@cong-55 tmp]# sh test.sh abcdef testvar2 testvar2 ##定义了var2,并把testvar2赋值给var2. [root@cong-55 tmp]#
实例4:${var:=DEFAULT}
[root@cong-55 tmp]# cat test.sh [root@cong-55 tmp]# cat test.sh #!/bin/bash # var="abcdef" var1="" echo "${var:=testvar}" echo "${var1:=testvar1}" echo "${var2:=testvar2}" echo "${var2}" [root@cong-55 tmp]# sh test.sh abcdef testvar1 testvar2 testvar2 ##定义并赋值给var2 [root@cong-55 tmp]#
实例5:${var+OTHER}
[root@cong-55 tmp]# cat test.sh #!/bin/bash # var="abcdef" var1="" echo "${var+testvar}" echo "${var1+testvar1}" echo "${var2+testvar2}" echo "${var2}" [root@cong-55 tmp]# sh test.sh testvar ##因为定义了var,所以打印testvar字符串 testvar1 ##因为定义了var1,所以打印testvar1字符串 ##var2没有被定义,所以打印null值
实例6:${var:+OTHER}
[root@cong-55 tmp]# cat test.sh #!/bin/bash # var="abcdef" var1="" echo "${var:+testvar}" echo "${var1:+testvar1}" echo "${var2:+testvar2}" echo "${var2}" [root@cong-55 tmp]# sh test.sh testvar ##因为var被声明并且不为空,所以打印testvar ##因为var1被声明,但是var的值为空,所以打印空值 ##因为var2没有声明,所以打印空值。如果值为空或不声明就会打印空值。 [root@cong-55 tmp]#
实例7:${!varprefix*}
[root@cong-55 tmp]# cat test.sh #!/bin/bash # var="abcdef" var1=" " var2="123456" echo "${!var*}" [root@cong-55 tmp]# sh test.sh var var1 var2 [root@cong-55 tmp]#
实例8:${!varprefix@}
[root@cong-55 tmp]# cat test.sh #!/bin/bash # var="abcdef" var1=" " var2="123456" echo "${!var@}" [root@cong-55 tmp]# sh test.sh var var1 var2 [root@cong-55 tmp]#
二。字符串操作(长度,读取,替换)
${#string} $string的长度 ${string:position} 在$string中, 从位置$position开始提取子串 ${string:position:length} 在$string中, 从位置$position开始提取长度为$length的子串 ${string#substring} 从变量$string的开头, 删除最短匹配$substring的子串 ${string##substring} 从变量$string的开头, 删除最长匹配$substring的子串 ${string%substring} 从变量$string的结尾, 删除最短匹配$substring的子串 ${string%%substring} 从变量$string的结尾, 删除最长匹配$substring的子串 ${string/substring/replacement} 使用$replacement, 来代替第一个匹配的$substring ${string//substring/replacement} 使用$replacement, 代替所有匹配的$substring ${string/#substring/replacement} 如果$string的前缀匹配$substring, 那么就用$replacement来代替匹配到的$substring ${string/%substring/replacement} 如果$string的后缀匹配$substring, 那么就用$replacement来代替匹配到的$substring
实例1: ${string:position:length}
[root@cong-55 tmp]# cat test.sh #!/bin/bash # var="abcdef" var1=" " var2="123456" echo "${var:2:3}" ##从第二个字符开始,截取3个字符。字符从0开始,比如a是第0个,b是第1个,c是第2个,所以是cde [root@cong-55 tmp]# sh test.sh cde [root@cong-55 tmp]#
实例2:${string#substring}
[root@cong-55 tmp]# cat test.sh #!/bin/bash # var="aa/bb/cc/dd/test.txt" echo "${var#/}" echo "${var#*/}" ##删除从字符串的开头,到第一个‘/’字符的内容 [root@cong-55 tmp]# sh test.sh aa/bb/cc/dd/test.txt bb/cc/dd/test.txt [root@cong-55 tmp]#
实例3:${string##substring
[root@cong-55 tmp]# cat test.sh #!/bin/bash # var="aa/bb/cc/dd/test.txt" echo "${var##/}" echo "${var##*/}" ####删除从字符串的开头,到最后一个‘/’字符的内容 [root@cong-55 tmp]# sh test.sh aa/bb/cc/dd/test.txt test.txt [root@cong-55 tmp]#
实例4:${string%substring}
[root@cong-55 tmp]# cat test.sh #!/bin/bash # var="aa/bb/cc/dd/test.txt" echo "${var%/}" echo "${var%/*}" ##删除从字符串的结尾开始,到前一个‘/’字符的内容 [root@cong-55 tmp]# sh test.sh aa/bb/cc/dd/test.txt aa/bb/cc/dd [root@cong-55 tmp]#
实例5:${string%%substring}
[root@cong-55 tmp]# cat test.sh #!/bin/bash # var="aa/bb/cc/dd/test.txt" echo "${var%%/}" echo "${var%%/*}" ##删除从字符串的结尾开始,到最前一个‘/’字符的内容 [root@cong-55 tmp]# sh test.sh aa/bb/cc/dd/test.txt aa [root@cong-55 tmp]#
${变量名#substring正则表达式}从字符串开头开始配备substring,删除匹配上的表达式。
${变量名%substring正则表达式}从字符串结尾开始配备substring,删除匹配上的表达式。
注意:${test##*/},${test%/*} 分别是得到文件名,或者目录地址最简单方法。
实例6:${string/substring/replacement}
[root@cong-55 tmp]# cat test.sh #!/bin/bash # var="aa/bb/cc/dd/test.txt" echo "${var/aa/ZZ}" ##使用ZZ替换提一个aa [root@cong-55 tmp]# sh test.sh ZZ/bb/cc/dd/test.txt [root@cong-55 tmp]#
实例7:${string//substring/replacement}
[root@cong-55 tmp]# cat test.sh #!/bin/bash # var="aa/bb/aa/dd/aa/aa.txt" echo "${var//aa/ZZ}" ##使用ZZ字符替换字符串中所有的aa字符 [root@cong-55 tmp]# sh test.sh ZZ/bb/ZZ/dd/ZZ/ZZ.txt [root@cong-55 tmp]#
实例8:${string/#substring/replacement}
[root@cong-55 tmp]# cat test.sh #!/bin/bash # var="aa/bb/aa/dd/aa/aa.txt" echo "${var/#aa/ZZ}" [root@cong-55 tmp]# sh test.sh ZZ/bb/aa/dd/aa/aa.txt [root@cong-55 tmp]#
实例9:${string/%substring/replacement}
[root@cong-55 tmp]# cat test.sh #!/bin/bash # var="aa/bb/aa/dd/aa/aa.txt" echo "${var/%txt/ZZ}" [root@cong-55 tmp]# sh test.sh aa/bb/aa/dd/aa/aa.ZZ [root@cong-55 tmp]#