bash分配默认值

$ {parameter:= word}分配默认值。 如果参数未设置或为空,则将单词的扩展分配给参数。 参数的值将被replace。 位置参数和特殊参数不能以这种方式分配。

我以为我可以使用这个function来写${LONG_VARIABLE_NAME:=hello}而不是更长的LONG_VARIABLE_NAME=${LONG_VARIABLE_NAME:-hello} ,但是现在bash也试图执行'hello',并且没有find命令。 任何方法来避免这种情况? 或者我会不得不坚持后者? 有人可以举一个例子,指定默认值实际上是有用的吗?

使用冒号:

 : ${A:=hello} 

冒号是一个空命令,它什么也不做,并且忽略它的参数。 它被内置到bash中,所以不会创build新的进程。

请看http://www.tldp.org/LDP/abs/html/parameter-substitution.html例子;

 ${parameter-default}, ${parameter:-default} 

如果参数未设置,则使用默认值。 通话结束后,参数仍未设置。
两种forms几乎相同。 额外的:只有在声明参数时才有所作为,但为空。

 unset EGGS echo 1 ${EGGS-spam} # 1 spam echo 2 ${EGGS:-spam} # 2 spam EGGS= echo 3 ${EGGS-spam} # 3 echo 4 ${EGGS:-spam} # 4 spam EGGS=cheese echo 5 ${EGGS-spam} # 5 cheese echo 6 ${EGGS:-spam} # 6 cheese 

 ${parameter=default}, ${parameter:=default} 

如果参数未设置,则将参数值设置为默认值。
两种forms几乎相同。 The:只有在声明了参数并且为空时才有所作为

 # sets variable without needing to reassign # colons suppress attempting to run the string unset EGGS : ${EGGS=spam} echo 1 $EGGS # 1 spam unset EGGS : ${EGGS:=spam} echo 2 $EGGS # 2 spam EGGS= : ${EGGS=spam} echo 3 $EGGS # 3 (set, but blank -> leaves alone) EGGS= : ${EGGS:=spam} echo 4 $EGGS # 4 spam EGGS=cheese : ${EGGS:=spam} echo 5 $EGGS # 5 cheese EGGS=cheese : ${EGGS=spam} echo 6 $EGGS # 6 cheese 

 ${parameter+alt_value}, ${parameter:+alt_value} 

如果设置了参数,使用alt_value,否则使用空string。 通话结束后,参数值不变。
两种forms几乎相同。 The:只有在声明了参数并且为空时才有所作为

 unset EGGS echo 1 ${EGGS+spam} # 1 echo 2 ${EGGS:+spam} # 2 EGGS= echo 3 ${EGGS+spam} # 3 spam echo 4 ${EGGS:+spam} # 4 EGGS=cheese echo 5 ${EGGS+spam} # 5 spam echo 6 ${EGGS:+spam} # 6 spam 

默认值参数扩展在构build如下例所示的脚本时通常很有用。 如果用户只按原样调用脚本,则不会内置perl。用户必须明确地将WITH_PERL设置为“no”以外的其他值才能将其内置。

 $ cat defvar.sh #!/bin/bash WITH_PERL=${WITH_PERL:-no} if [[ "$WITH_PERL" != no ]]; then echo "building with perl" # ./configure --enable=perl else echo "not building with perl" # ./configure fi 

没有 Perl的构build

 $ ./defvar.sh not building with perl 

Perl构build

 $ WITH_PERL=yes ./defvar.sh building with perl