我遇到过这段代码这里:
#!/bin/bash
# ...
if [[ "${1-}" =~ ^-*h(elp)?$ ]]; then
echo "Usage..."
exit
fi
我知道它的作用是在传递任何参数(如-h
, --help
, -help
, )时打印使用信息。-------help
但为什么"${1-}"
而不仅仅是"${1}"
?连字符有什么作用?
起初我认为这可能意味着从位置 1 开始的任何论证。我试过了,不,不是那样的。
然后我认为这可能是一个错字,作者的意思是"${1-9}"
允许所有数字位置。再说一次,它不起作用,它甚至不是有效的代码。
答案1
参数扩展中的连字符允许指定默认值。 So 的${1-}
意思是“第一个参数的值(如果已设置),否则为空字符串”。
这看起来并不是特别有用,因为未设置的变量无论如何都会扩展到空字符串。然而,如果启用并且没有给出参数,${1}
则会导致错误,而不会 - 因此一些 shell 程序员在引用可能合法未设置的变量时总是使用这种形式。set -u
${1-}
在您找到此内容的网站上下文中,这与第 5 号“事物”相符:
更喜欢使用
set -o nounset
.你可能有一个很好的借口不这样做,但是,我认为,最好总是设置它。
- 当访问未设置的变量时,这将使脚本失败。避免因变量名称中的拼写错误而产生可怕的意外后果。
- 当您想要访问可能已设置或尚未设置的变量时,使用
"${VARNAME-}"
代替"$VARNAME"
,就可以了。