Bash 分配默认值

${参数: = word } 指定默认值。如果参数未设置或为空,则 单词的扩展被分配给 参数的值是 然后被替换,就位 参数及特别设计 参数可能不会以这种方式指定。

我认为我可以使用这个特性来编写 ${LONG_VARIABLE_NAME:=hello}而不是更长的 LONG_VARIABLE_NAME=${LONG_VARIABLE_NAME:-hello},但是现在 bash 也尝试执行‘ hello’,并且给出了一个未找到的命令。有办法避免吗?或者我只能坚持后者?谁能举个例子说明赋值默认值实际上是有用的?

150923 次浏览

使用冒号:

: ${A:=hello}

冒号是一个空命令,不执行任何操作并忽略其参数。它被内置到 bash 中,因此不会创建新的进程。

默认值参数展开在构建脚本(如下面的示例)中通常很有用。如果用户只是按原样调用脚本,则不会内置 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

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

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

如果未设置参数,则使用默认值。调用后,仍未设置参数。
这两种形式几乎是等价的。额外的 :只有在参数声明为 null 时才会产生差异。

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,否则使用 null 字符串。
这两种形式几乎是等价的。只有当参数声明为空时: 才会产生差异

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

您也可以使用 :=构造来在一个步骤中分配和决定操作:

# 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将在 if条件字段中分配给 server,触发器匹配和报告匹配结果。通过这种方式,您可以动态分配并触发适当的操作。