例子1:
$ str= 
$ var=${str=expr} 
$ echo $var

$ echo $str

例子2:
$ unset str 
$ var=${str=expr} 
$ echo $var
expr
$ echo $str
expr

 

原理:
 
null是指该变量存在(内存存储单元),但其值是空的。
set | grep variable_name
unset是删除变量名(连同内存存储单元也一并删除),说白一点,就是该变量不存在了。
set | grep variable_name

${parameter=word}
注意"="等号左边没有":"冒号。

${parameter=word}
一、如果parameter属于unset的那种情况:
parameter没进行定义,bash就把word赋值给parameter,并显示parameter变量的值。
$ echo $testvar #没有定义testvar变量

$ echo ${testvar=123}
$ 123

$ echo $testvar #打印testvar的值
$ 123

二、如果parameter属于null那种情况
${parameter=word},由于parameter进行了定义(只不过其值为空),那么bash只显示parameter的值(后面也就不进行赋值操作)。
$ testvar=  #对testvar赋null值
$ echo ${testvar=123} #无内容显示

$ echo $testvar #无内容显示

如果把${testvar:=123},注意多了一个冒号,其运行结果跟上述的unset的那种情况一样。
":" 是指为空(null)的意思。
${testvar:=123},不管testvar为空或者没有进行定义,都把123赋给testvar这个变量,并打印该变量的值。

还有
1. var=${str-expr} vs var=${str:-expr}
2. var=${str+expr} vs var=${str:+expr}
3. var=${str?expr} vs var=${str:?expr}
这些都是变量替换的几种形式。