Linux Shell脚本中变量替换

1. :=句法
在这种替换中,使用和前例中相同的句法来设置默认值。

username=""
echo "${username:=$logname}"

在使用”:=”进行比较时,username变量已经被定义了,但是它的值为空,因此这里对echo命令使用了变量logname的值,即设置变量username的值为logname的值。
3.=句法
下面的语句和:=句法非常类似,但是没有冒号

username=""
echo "${username=$logname}"

和前面一样,变量username已经被定义,但是它的值为空,在这个句法中,命令将会输出”echo”之后语句的执行结果。因为变量username虽然为空,但已经被定义了,所以除了一个回车不会再有其他输出。只有当username变量完全没有被定义时才会将其设置为变量logname的值。
3.:-句法
在这个命令中,因为变量username虽然已被定义,但是值为空,echo语句将用logname变量的值

username=""
echo "${username:-$logname}"

这里username变量的值保持不变,这个命令和使用=句法命令的不同之处是,再次命令被执行前,仅仅在代码中的”${}”句法中作替换,也就是说echo命令将输出logname变量的值,但是这个值不会被赋值给username变量。
4.-句法
当删掉上述的:-句法中的冒号,即变成-时,因为username变量已经被定义,输出将为空。如果未定义就会使用logname变量的值。还有一点也与:-句法相同,即username变量的值没有改变。
5.:?句法
使用:?句法时,如果username变量已经被定义为非空值,在echo命令中就会使用username变量的值。如果username变量已被定义但却没有一个真正的值(也就是说为空),或者完全未被定义,那么在echo命令中就会使用logname的值,并且脚本退出运行。

username=""
echo "${username:?$logname}"

如果把问号之后的参数改为某种错误字符串,那这个语句就会在代码调试和查找未定义变量时变得很有用,这段代码不仅仅输出字符串,而且会显示代码在脚本中所在行的位置。
6.?句法
从:?句法中去掉冒号是得username变量不必一定为非空值。如果username只被设置为一个控制,那么将使用这个空值。相反的,如果username变量没有被定义,则通前述的:?句法,执行logname替换,脚本退出运行,并显示退出时所在代码行在脚本中的位置。

username=""
echo "${username?$logname}"

7.:+句法
和前面例子相比,这个句法有相反的作用,这是因为,只有当变量已被定义而不是未定义的时候,”${}”表达式才执行替换。

username=""
echo "${username:+$logname}"

如果这里的username变量已经被定义而且非空,因此使用logname的值,如果username变量未定义,或者已定义但为空,则将使用空值。在任何情况下,username变量的值都不会改变。
8.+句法
如果删掉前例:+中的冒号,一旦变量被定义,”${}”表达式都将使用logname的值;进行这个替换时,username变量不需要有一个实际的值(即非空值)。如果username变量未被定义,将被替换为空值。

username=""
echo "${username+$logname}"

“:+”、”+”句法的用法很多是和”:-“、”-“句法的用法相同的。最主要的区别是”:+”、”+”示例检查的是一个已定义的变量而不是未定义的变量。这类似于假发剑法是一枚硬币的两面。

你可能感兴趣的:(Shell)