$ {参数:=字} 分配默认值。如果参数未设置或为null,则 扩展单词被分配给 参数。参数的值是 然后替换。位置 参数和特殊 参数可能不会以这种方式分配。
我以为我可以使用此功能来编写${LONG_VARIABLE_NAME:=hello}
而不是更长的LONG_VARIABLE_NAME=${LONG_VARIABLE_NAME:-hello}
,但是现在bash也会尝试执行'hello'并且找不到命令。有什么办法可以避免吗?或者我必须坚持后者?有人可以给出一个分配默认值实际有用的例子吗?
答案 0 :(得分:170)
使用冒号:
: ${A:=hello}
冒号是一个null命令,不执行任何操作并忽略其参数。它内置于bash中,因此不会创建新进程。
答案 1 :(得分:68)
请查看http://www.tldp.org/LDP/abs/html/parameter-substitution.html示例
${parameter-default}, ${parameter:-default}
如果未设置参数,请使用默认值。通话结束后,参数仍未设定
两种形式几乎相同。额外的:
仅在声明参数时才有所不同,但是为空。
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}
如果未设置参数,请将参数值设置为默认值 两种形式几乎相同。 :仅在声明参数且为空时才有所不同
# 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,否则使用空字符串。通话结束后,参数值没有改变 两种形式几乎相同。 :仅在声明参数且为空时才有所不同
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
答案 2 :(得分:17)
默认值参数扩展通常在构建脚本中很有用,如下面的示例一样。如果用户只是按原样调用脚本,则不会内置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构建
$ ./defvar.sh
not building with perl
使用 Perl构建
$ WITH_PERL=yes ./defvar.sh
building with perl
答案 3 :(得分:0)
您还可以使用:=
构造来一步分配和决定操作。考虑以下示例:
# Example of setting default server and reporting it's status
server=$1
if [[ ${server:=localhost} =~ [a-z] ]] # 'localhost' assigned here to $server
then echo "server is localhost" # echo is triggered since letters were found in $server
else
echo "server was set" # numbers were passed
fi
如果$1
不为空,则会在localhost
条件字段中将server
分配给if
,触发匹配并报告匹配结果。这样,您可以即时分配并触发适当的操作。