以下を含むスクリプトを見ています。
if [ "${PS1-}" ]; then
この末尾は-
Posix や Bash 標準構文に従わないようで、少し迷惑です。これは常に存在する構文ミステリーですか、それともスペルエラーですか?標準/文書への参照は非常に感謝します。
通常、次のようにコーディングします。
if [ "$PS1" ]; then
どちらがより正確ですか?それとも、2つの間に違いはありますか?
ベストアンサー1
変数拡張${parameter:-word}
が設定され、nullでない場合(空の文字列ではない)、使用する値。それ以外の場合は文字列が使用されます。$parameter
word
省略すると、:
値が空かどうかはテストされず、設定されていないかどうかだけテストされます。
つまり、設定されている場合は${PS1-}
値に展開されますが、空白または設定されていない場合は空の文字列に展開されます。$PS1
この場合、まったく同じ${PS1:-}
次の文字列も空です-
。
"${PS1-}"
@Rakesh Sharmaが指摘したように、との違いは"$PS1"
微妙です。どちらも値に拡張または$PS1
設定されていない場合は、空の文字列に展開されます。アクティブなときは例外ですset -u
。この場合、設定されていない変数を拡張するとエラーが発生します。。設定の(空白)デフォルトは"${PS1-}"
これをバイパスし、unsetをPS1
エラーなしで空の文字列に展開します。
これは標準構文です。(Bourne Shellは1970年代後半に始まりました。)と他の同様の拡張機能があります。