shell:当var未设置或为null时,$ {var: - }的目的是什么?

时间:2016-08-12 02:48:43

标签: linux bash shell

在我的Linux Mint 17.2 /etc/bash.bashrc中,我看到以下内容:

# set variable identifying the chroot you work in (used in the prompt below)
if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then
    debian_chroot=$(cat /etc/debian_chroot)
fi

这是对令牌debian_chroot的第一次引用。

为什么此代码使用${debian_chroot:-}而不只是$debian_chroot

Bash的Shell Parameter Expansion说:

  

$ {参数:-word}

     

如果参数未设置或为null,则替换单词的扩展。否则,参数的值将被替换。

在这里,"字"是null,那么为什么还要将null替换为null?

3 个答案:

答案 0 :(得分:3)

语法${debian_chroot:-}会阻止shell在set -u运行时退出(使用未定义变量时崩溃),并且此时未设置debian_chroot

希望普通的交互式shell拥有set -u(它会很容易崩溃),但它在脚本中非常有用。

要看到这个:

bash -c 'set -u; [ -z $a ]; echo ok'          # error
bash -c 'set -u; a=; [ -z $a ]; echo ok'      # ok
bash -c 'set -u; [ -z ${a:-} ]; echo ok'      # ok
bash -c 'set -u; a=; [ -z ${a:-} ]; echo ok'  # ok

答案 1 :(得分:1)

如果使用"${variable:-}"以某种方式调用shell或执行set -u,使用-u表示法可以保护脚本免于错误 - 当您使用未定义的变量时会导致投诉。

  

-u在执行参数扩展时,将特殊参数“@”或“*”以外的未设置变量和参数视为错误。将向标准错误写入错误消息,并退出非交互式shell。

答案 2 :(得分:-1)

目的是设置一个默认值,以便bash中的某些结构不会中断。例如

假设var未设置,则:

if [ $var = "" ] #breaks => bash: [: =: unary operator expected

 if [ "${var:-}" = "" ] # works fine

如果是

if [ -z "${debian_chroot:-}" ] # z checks if a SET variable is empty.

虽然 ,但如果未设置"${debian_chroot}" bash选项,则它只会与-u一起使用。 / p>

[ bash reference ]说:

  

-u(nounset)尝试使用未定义的变量输出错误消息,并强制退出

脚本

#!/bin/bash -u
# note variable 'var' is unset
# Try the script as is and uncommenting the below line
#declare var=
if [ -z "${var}" ]
then
 echo "var is empty"
fi
# "${var:-}" would work even if the 'var' is not 'declare'd.

会给你更好的主意。