变量内容的删除、替代与替换


变量内容的删除
${parameter#*word}
${}:关键字,这种删除模式必须存在;
parameter:变量名称;
#:代表从变量内容的最前面开始向右删除,且仅删除最短的那个;
*word:代表要被删除的部分,*是通配符来替代0到无穷多个任意字符。

#:  从变量内容最前面开始向右删除符合替换文字的“最短的”那一个;

##:从变量内容最前面开始向右删除符合替换文字的“最长的”那一个。


例子:

[root@www ~]# Dir=/usr/local/src
[root@www ~]# echo $Dir
/usr/local/src
[root@www ~]# echo ${Dir#*/}
usr/local/src
[root@www ~]# echo ${Dir##*/}
src


变量内容的替换
${parameter/pattern/string}
${parameter//pattern/string}
${}:关键字;
parameter:变量;
/或//:关键字
pattern:匹配模式,旧字符串
string:新字符串

/.../... :变量内容符合“旧字符串”,则第一个旧字符串会被新字符串替换;
//.../...:变量内容符合“旧字符串”,则全部的旧被新字符串替换。

例子:
[root@www ~]# Dir=/usr/local/src/usr/local/src
[root@www ~]# echo $Dir
/usr/local/src/usr/local/src
[root@www ~]# echo ${Dir/usr/USR}
/USR/local/src/usr/local/src
[root@www ~]# echo ${Dir//usr/USR}
/USR/local/src/USR/local/src


总结:

变量设置方式

功能

${var#keyword}

变量内容从头开始的数据符合“keyword”,则将符合的最短数据删除

${var##keyword}

变量内容从头开始的数据符合“keyword”,则将符合的最长数据删除

${var%keyword}

变量内容从尾向前的数据符合“keyword”,则将符合的最短数据删除

${var%%keyword}

变量内容从尾向前的数据符合“keyword”,则将符合的最长数据删除

${var/old_str/new_str}

变量内容符合“old_str”,则第一个old_str会被new_str替换

${var//old_str/new_srt}

变量内容符合“old_str”,则全部的old_str会被new_str替换


变量的测试与内容替换
${parameter:-word}
${}:关键字
parameter:变量
:-:关键字,被测试的选项
word:变量的替换内容



变量的设置方式

str没有设置

str为空字符串

str已经设置自为非空字符串

var=${str-expr}

var=expr

var=

var=$str

var=${str:-expr}

var=expr

var=expr

var=$str

var=${str+expr}

var=

var=expr

var=expr

var={str:+expr}

var=

var=

var=expr

var=${str=expr}

str=expr

var=expr

str不变

var=

str不变

var=$str

var={str:=expr}

str=expr

var=expr

str=expr

var=expr

str不变

var=$str

var=${str?expr}

expr输出至stderr

var=

var=str

var=${str:?expr}

expr输出至stderr

expr输出至stderr

var=str



常用的变量替换:
${parameter:-word}
Use Default Values.  If parameter is unset or null, the expansion  of  word  is  substituted.  Otherwise, the value of parameter is substituted.
使用默认值(不会修改变量原有内容),如果变量未设置或为空,则使用word替换变量的默认值,无论${parameter:-word}的结果返回值是什么,如果该变量的默认值未设置或为空,那么依然为空。
[root@www ~]# unset FQDN                                          #变量没有设置
[root@www ~]# echo $FQDN
[root@www ~]# echo ${FQDN:-www.snkof.com}    #变量没有设置,使用word的值替换变量的值
www.snkof.com
[root@www ~]# FQDN=''                                                 #变量设置为空字符串
[root@www ~]# echo ${FQDN:-www.snkof.com}     #如果变量为空字符串则使用word的值替换变量的值
www.snkof.com
[root@www ~]# FQDN=www.google.com.hk          #变量设置了值
[root@www ~]# echo ${FQDN:-www.snkof.com}     #变量使用默认值
www.google.com.hk
[root@www ~]# echo $FQDN                      #变量依然使用默认值                              
www.google.com.hk


${parameter:=word}
Assign Default Values.  If parameter is unset or null, the expansion of word is assigned to parameter.  The value of parameter is then substituted.   Positional  parameters  and special parameters may not be assigned to in this way.
指定默认值、赋予默认值(将word的值赋予给该变量)。如果变量为未设置或为空,则把word的值替换成变量的默认值,而且将word的值保存在该变量中。位置参数和特殊参数不能以这种方式设置。
[root@www ~]# unset FQDN                                                #变量未设置
[root@www ~]# echo $FQDN                                              
[root@www ~]# echo ${FQDN:=www.snkof.com}           #变量未设置,使用word的值替换成变量的默认值
www.snkof.com
[root@www ~]# echo $FQDN                                              #并且将word的值设置为FQDN变量的默认值
www.snkof.com
[root@www ~]# FQDN=''                                                     #变量设置为空字符串
[root@www ~]# echo ${FQDN:=www.snkof.com}           #如果变量为字符串则使用word的值替换成变量的默认值
www.snkof.com
[root@www ~]# echo $FQDN                                              #并且将word的值设置为FQDN变量的默认值
www.snkof.com
[root@www ~]# FQDN=www.google.com.hk                    #变量设置了值
[root@www ~]# echo ${FQDN:=www.snkof.com}           #使用变量的默认值
www.google.com.hk
[root@www ~]# echo $FQDN                                              #变量的默认值没有生发改变
www.google.com.hk
在很多场景需要一旦变量原来的值为空的时候,把word的值替换成变量的值,而且之后还要保存在这个变量中。
${parameter:=word}不但能够完成变量替换,而且能够将word的值赋值给变量的值为空的这个变量。变量的值是word。


${parameter:?word}
Display  Error  if  Null or Unset.  If parameter is null or unset, the expansion of word(or a message to that effect if word is not present) is written to  the  standard  error and  the  shell,  if it is not interactive, exits.  Otherwise, the value of parameter is substituted.
如果变量的值为空或没有设置,不会再被赋予任何值,把word当作错误信息显示出来,但会被输出到标准错误输出上去,为了做到更好的引用这个变量的替换结果,还可以被直接实现替换,替换的结果还可以保留到其他额外变量的当中,以便以后引用。
[root@www ~]# unset FQDN
[root@www ~]# echo ${FQDN:?novalue}
-bash: FQDN: novalue        #错误信息
[root@www ~]# echo $FQDN
                #FQDN没有任何值,只会显示错误信息给予警示。

这个错误信息将会定向至标准错误输出


${parameter:+word}:使用替换值
   Use Alternate Value.  If parameter is nullor  unset,  nothing is substituted, otherwise the expansion of word is substituted.
如果变量为空或末设置,不做任何事情。如果设置变量值就将word的值替换成该变量的值。

[root@www ~]# echo $FQDN
                         #FQDN本身为空值
[root@www ~]# echo ${FQDN:+www.google.com.hk}
                         #什么也没有做
[root@www ~]# echo $FQDN
                         #FQDN还是为空值
[root@www ~]# FQDN=www.google.com.hk #给FQDN赋值
[root@www ~]# echo ${FQDN:+www.snkof.com}
www.snkof.com                #如果变量有值,则替换成word的值
[root@www ~]# echo $FQDN
www.google.com.hk                #但是FQDN的值不会被改变

与${parament:-word}相对应,只会显示对应的值,不会对变量本身进行赋值。
在确保某一个变量有值的情况下,才将其修改使用另外的值。