1.:=
username 未定义或值为空时会被设置为变量 LOGNAME 的值
只有当变量 username 已经被定义且有一个非空值时,才不会被设置为 LOGNAME 值
2.=
只要变量 username 已经被定义,不论值是否为空都不会被设置为变量 LOGNAME 值
下面示例中均不会改变 LOGNAME 值,所以就不不再赋值
3.:-
username 不论是否定义及值是否为空,整个命令运行完成后,username均不会被设置为 LOGNAME 的值。
总之,username不会被替换为 LOGNAME 值,echo 会寻找第一个非空的值输出
至于 username 在 ${} 中是否被替换,这个还没测试
4.-
不论是否定义及值是否为空,username不会被替换为 LOGNAME 值,echo 会找到第一个已经设置的变量的值输出,如果username没有被设置,将输出 LOGNAME 的值
5.:?
同 :- 一样,echo 会输出 username 和 LOGNAME 中值非空的一个;不论是否定义及值是否为空,username不会被替换为 LOGNAME 值
同 :- 的唯一区别是当 username 未设置或值为空时,echo 输出结果的同时会显示脚本当前运行位置并退出
比较下面两个脚本及运行结果的异同:
6.?
同 :? 的区别为 ? 并不要求 username 值一定为非空,即如果 username值只要设置了,那么即使为空,脚本也不会退出,比较如下脚本:
7.:+
当变量值 username 被定义且不为空的时候 ${} 表达式才执行替换,如果username 未定义或值为空,则使用空值。 username 值不会被改变。
这个符号可用来检查一个已经定义的变量值是否为空
8.+
只要 username 被定义,不论值是否为空,${} 都将使用LOGNAME 的值
Reference
Ron Perters.Expert Shell Scripting