我正在查看一个脚本,其中包含:
if [ "${PS1-}" ]; then
这个尾随-
有点让我烦恼,因为它似乎不符合 Posix 或 Bash 标准语法。这是一些永远存在的神秘语法,还是一个拼写错误?任何对标准/文档的引用将不胜感激。
通常我会编码:
if [ "$PS1" ]; then
哪个更正确或者它们之间有区别吗?
答案1
如果变量扩展已设置并且非空(不是空字符串),则变量扩展${parameter:-word}
将使用 的值,否则将使用 string 。$parameter
word
省略:
将不会测试该值是否为空,只会测试它是否未设置。
这意味着如果已设置,${PS1-}
则将扩展到 的值,但如果为空或未设置,则将扩展为空字符串。$PS1
在这种情况下,这是一模一样因为${PS1:-}
后面的字符串-
也是空的。
"${PS1-}"
和之间的区别"$PS1"
很微妙,正如@Rakesh Sharma 指出的那样:两者都会扩展为 的值$PS1
,或者如果未设置,则扩展为空字符串。例外是当set -u
处于活动状态时,在这种情况下,扩展未设置的变量会导致错误。设置的(空)默认值"${PS1-}"
绕过了这一点,将未设置扩展PS1
为空字符串而不会出现错误。
这是标准语法(起源于 70 年代末的 Bourne shell),以及其他一些类似的扩展。
答案2
这绝对是POSIX 语法。释义:
使用${parameter-word}
, 如果parameter
是
- 设置且不为 null,然后替换 的值
parameter
, - 设置为 null,然后替换 null,并且
- 取消设置,然后替换
word
.
会话示例:
$ echo "${parameter-word}"
word
$ parameter=
$ echo "${parameter-word}"
$ parameter=value
$ echo "${parameter-word}"
value
这里的“Null”只是指空字符串。例如,与 SQL 相比,POSIX shell 中没有特殊的 null 值。
这也记录在 的“参数扩展”部分中man bash
。
答案3
语法:
${parameter:-word}
和一个特殊的形式:
${parameter-word}
是个POSIX shell 中的有效语法word
, 表示如果parameter
未设置或为 null,则使用默认值。
通常情况下,withword
为空,则:
${parameter-}
和:
$parameter
或者:
${parameter}
是等价的。
但在 的作用下set -u
,所有未设置的变量都会导致 shell 终止。${parameter-}
用于绕过该严格规则。它在两种情况下都有效,所以是的,这是更正确的方法。