web-dev-qa-db-ja.com

"$ {PS1-}"は有効な構文ですか?それはプレーンな "$ PS1"とどう違うのですか?

次のようなスクリプトを探しています。

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

その末尾- PosixやBashの標準構文とは思えないため、少しバグがあります。これは永遠に存在していたいくつかの難解な構文ですか、それともタイプミスですか?標準/ドキュメントへの参照はいただければ幸いです。

通常、私はそれをコーディングします:

if [ "$PS1" ]; then

どちらがより正しいですか、またはそれらの間に違いがありますか?

12
Gregor

これは間違いなく POSIX構文 です。言い換え:

parameterの場合、${parameter-Word}を使用

  • null以外の値を設定し、parameterの値を代入します。
  • 設定されているがnullの場合、nullに置き換え、
  • 設定解除してから、Wordに置き換えます。

セッションの例:

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

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

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

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

12
l0b0

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

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

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

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

これは標準的な構文です70年代後半のBourne Shellで作成されたもの )。他のいくつかの同様の拡張と同様です。

23
Kusalananda

構文:

${parameter:-Word}

そして特別な形:

${parameter-Word}

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


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

${parameter-}

そして:

$parameter

または:

${parameter}

同等です。

ただし、set -uの影響下では、未設定のすべての変数によってシェルが終了します。 ${parameter-}は、その厳密なルールをバイパスするために使用されます。どちらの場合でも機能するので、はい、より正しい方法です。

6
cuonglm