bash指定默认值

时间:2010-12-14 09:21:15

标签: bash

  

$ {参数:=字}                 分配默认值。如果参数未设置或为null,则   扩展单词被分配给   参数。参数的值是   然后替换。位置   参数和特殊                 参数可能不会以这种方式分配。

我以为我可以使用此功能来编写${LONG_VARIABLE_NAME:=hello}而不是更长的LONG_VARIABLE_NAME=${LONG_VARIABLE_NAME:-hello},但是现在bash也会尝试执行'hello'并且找不到命令。有什么办法可以避免吗?或者我必须坚持后者?有人可以给出一个分配默认值实际有用的例子吗?

4 个答案:

答案 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,触发匹配并报告匹配结果。这样,您可以即时分配并触发适当的操作。