这个if条件等价于测试变量的存在吗



我正在挖掘Mac上的一些系统文件。在/etc/profile中,我发现了以下摘录:

if [ "${BASH-no}" != "no" ]; then
[ -r /etc/bashrc ] && . /etc/bashrc
fi

我已经尝试过echo "${x-no}"用于x的各种选择,并且它似乎在打印x的值,只要x存在(即已经设置(,否则打印no

这让我想知道:这个条件是否只是测试变量x是否已经设置?

进一步的问题:-究竟做什么?有没有更好的方法来测试变量是否已经设置?

${BASH-no}的含义记录在单一Unix规范的§2.6.2"参数扩展"中

${参数:-[单词]}

使用默认值如果参数未设置或为空,则应替换单词的扩展(如果省略单词,则为空字符串(;否则,应替换参数的值。

省略冒号时的含义(如您的示例中所示(稍后将进行描述:

在前面显示的参数展开中,在格式中使用将导致对未设置或为null的参数进行测试;的省略将导致对仅未设置的参数进行测试。

然后是一个表,它可能更容易理解。以下是相关行:

${ 参数 :- 单词
${ 参数 - 单词 }

这个条件只是测试变量x是否已设置吗?

是的,尽管在BASH=no这一不太可能的事件中会混淆。

-到底做什么?

这里是man bash:

[...] Omitting the colon results in a test only for a parameter that is  un‐set.
${parameter:-word}
Use Default Values.  If parameter is unset or null (see above),
the expansion of word is substituted. Otherwise, the
value of parameter is substituted.

是否有更好的方法来测试变量是否已设置?

是:[ -v BASH ]。然而,这是特定于bash的,因此它无法在执行特定于bash的操作之前检查当前shell是否为bash。