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


12

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

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

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

通常我会编写代码:

if [ "$PS1" ]; then

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

Answers:


12

这绝对是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


1
我猜bash和dash手册页是不完整的,因为它们没有提到这种语法(奇数)!
格雷戈尔(Gregor)

1
@Gregor这两本手册都提到了这一点。在Bash手册中,它位于参数扩展列表之前的段落中,而在Dash手册中,则位于参数扩展列表之后的段落中。
Kusalananda

1
好吧,“省略结肠……。”我没有看到:(
Gregor

zsh我所知道的唯一一个外壳明确地提到了无冒号的变体,而不仅仅是记下省略冒号是什么。
chepner

1
@ pts,POSIX中的文本几乎完全使用术语“空”,这可以解释其在手册页中的用法。
ilkkachu

23

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

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

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

就像@Rakesh Sharma指出的那样,"${PS1-}"和之间的区别"$PS1"很细微:两者都将扩展为的值$PS1,或者如果未设置则扩展为空字符串。例外是when set -u处于活动状态,在这种情况下,扩展未设置的变量将导致error。通过设置的(空)默认值"${PS1-}"可以避免这种情况,将unset扩展PS1为空字符串而不会出现错误。

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


而且,由于已将其引号引起来,因此与相同"$PS1",因为如果PS1为空,则为空,并且引号可以防止单词完全消失。
ilkkachu

4
只要set -u无效。当nounset选项打开时,“ $ PS1” =>给出错误。“ $ {PS-}”不会。

@RakeshSharma很好。不同的语法实际上会根据名词设置选项产生不同的结果,因此,测试[“ $ {parameter-}”]可能更正确!
格里高尔(Gregor)

1
@Kusalananda:请注意,如果它是NON-NULL ,${parameter:-word}将使用$parameter它的值。在其他所有情况下(意味着:设置但为NULL或未设置),它将使用word。您的措辞:if its set or null

@ikkachu:是的,这是正确的。仅当变量为set AND nonnull=> 时才使用其自身,否则(set but NULL OR unset)=>请使用word。

6

语法:

${parameter:-word}

和一种特殊形式:

${parameter-word}

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


通常,with word为空,则:

${parameter-}

和:

$parameter

要么:

${parameter}

是等效的。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.