"${PS1-}" 有効な構文ですか?通常の「$PS1」とどう違いますか?

"${PS1-}" 有効な構文ですか?通常の「$PS1」とどう違いますか?

以下を含むスクリプトを見ています。

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

この末尾は-Posix や Bash 標準構文に従わないようで、少し迷惑です。これは常に存在する構文ミステリーですか、それともスペルエラーですか?標準/文書への参照は非常に感謝します。

通常、次のようにコーディングします。

if [ "$PS1" ]; then

どちらがより正確ですか?それとも、2つの間に違いはありますか?

答え1

変数拡張${parameter:-word}が設定され、nullでない場合(空の文字列ではない)、使用する値。それ以外の場合は文字列が使用されます。$parameterword

省略すると、:値が空かどうかはテストされず、設定されていないかどうかだけテストされます。

つまり、設定されている場合は${PS1-}値に展開されますが、空白または設定されていない場合は空の文字列に展開されます。$PS1この場合、まったく同じ${PS1:-}次の文字列も空です-

"${PS1-}"@Rakesh Sharmaが指摘したように、との違いは"$PS1"微妙です。どちらも値に拡張または$PS1設定されていない場合は、空の文字列に展開されます。アクティブなときは例外ですset -uこの場合、設定されていない変数を拡張するとエラーが発生します。。設定の(空白)デフォルトは"${PS1-}"これをバイパスし、unsetをPS1エラーなしで空の文字列に展開します。

これは標準構文です。Bourne Shellは1970年代後半に始まりました。)と他の同様の拡張機能があります。

答え2

これは確かにPOSIX構文。定義:

次の場合を使用してください${parameter-word}parameter

  • null以外の値を設定したら、値を置き換えますparameter
  • nullに設定されてからnullを置き換えます。
  • 設定を解除して交換してくださいword

セッション例:

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

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

ここで、「ヌル」は単に空の文字列を意味する。たとえば、SQLとは異なり、POSIXシェルには特別なNULL値はありません。

この内容は、「パラメータの拡張」セクションにも説明されていますman bash

答え3

文法:

${parameter:-word}

そして特別な形態:

${parameter-word}

~であるPOSIXシェルの有効な構文wordparameter設定されていない、またはnullの場合はデフォルト値を使用することを意味します。


通常、withwordが空の場合は次のようになります。

${parameter-}

そして:

$parameter

または:

${parameter}

同等です。

ただし、の影響でset -u設定されていない変数がある場合、シェルは終了します。${parameter-}この厳格なルールをバイパスするために使用されます。どちらの場合でも動作するため、これはより正しいアプローチです。

関連情報