"${PS1-}" 语法是否有效,它与普通的 "$PS1" 有何不同?

Gre*_*gor 13 shell bash posix variable-substitution bourne-shell

我正在查看具有以下内容的脚本:

if [ "${PS1-}" ]; then
Run Code Online (Sandbox Code Playgroud)

尾随的-错误让我有点,因为它似乎不是 Posix 或 Bash 标准语法。这是一些永远存在的神秘语法,还是打字错误?任何对标准/文档的引用将不胜感激。

通常我会编码它:

if [ "$PS1" ]; then
Run Code Online (Sandbox Code Playgroud)

哪个更正确或者它们之间有什么区别?

Kus*_*nda 26

变量扩展${parameter:-word}将使用$parameterif 已设置且非空(不是空字符串)的值,否则将使用 string word

省略:将不会测试该值是否为空,只会测试它是否未设置。

这意味着如果它被设置,${PS1-}它将扩展为值$PS1,但如果它为空或未设置,则扩展为空字符串。在这种情况下,这是完全一样${PS1:-}作为后弦-也为空。

"${PS1-}"和之间的区别"$PS1"很微妙,正如@Rakesh Sharma 所指出的:两者都将扩展为 的值$PS1,如果未设置,则扩展为空字符串。例外是 whenset -u处于活动状态,在这种情况下,扩展未设置的变量会导致错误。设置的(空)默认值"${PS1-}"绕过了这一点,将未设置扩展PS1为空字符串而不会出错。

这是标准语法起源于 70 年代后期的 Bourne shell),以及其他一些类似的扩展。

  • 只要`set -u` 无效。当 nounset 选项打开时,"$PS1" => 会出错。"${PS-}" 不会。 (4认同)

l0b*_*0b0 12

这绝对是POSIX 语法。释义:

使用${parameter-word}, 如果parameter

  • 设置并且不为空,然后替换的值parameter
  • 设置但为空,然后替换为空,和
  • 取消设置,然后替换word.

示例会话:

$ echo "${parameter-word}"
word
$ parameter=
$ echo "${parameter-word}"

$ parameter=value
$ echo "${parameter-word}"
value
Run Code Online (Sandbox Code Playgroud)

“Null”在这里仅表示空字符串。例如,与 SQL 相比,POSIX shell 中没有特殊的空值。

这也记录在man bash.


cuo*_*glm 6

语法:

${parameter:-word}
Run Code Online (Sandbox Code Playgroud)

和一个特殊的形式:

${parameter-word}
Run Code Online (Sandbox Code Playgroud)

POSIX shell 中有效语法,表示word如果parameter未设置或为空则使用默认值。


通常, withword为空,则:

${parameter-}
Run Code Online (Sandbox Code Playgroud)

和:

$parameter
Run Code Online (Sandbox Code Playgroud)

或者:

${parameter}
Run Code Online (Sandbox Code Playgroud)

是等价的。

但是在 的影响下set -u,所有未设置的变量都会导致 shell 被终止。${parameter-}用于绕过该严格规则。它适用于两种情况,所以是的,这是更正确的方法。