“${PS1-}”是有效的语法吗?它与普通的“$PS1”有何不同?

“${PS1-}”是有效的语法吗?它与普通的“$PS1”有何不同?

我正在查看一个脚本,其中包含:

if [ "${PS1-}" ]; then

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

通常我会编码:

if [ "$PS1" ]; then

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

答案1

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

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

这意味着如果已设置,${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-}用于绕过该严格规则。它在两种情况下都有效,所以是的,这是更正确的方法。

相关内容