在我的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?
答案 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>
-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.
会给你更好的主意。