"${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年代後半に始まりました。)と他の同様の拡張機能があります。

おすすめ記事