
以下を含むスクリプトを見ています。
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年代後半に始まりました。)と他の同様の拡張機能があります。
答え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シェルの有効な構文word
、parameter
設定されていない、またはnullの場合はデフォルト値を使用することを意味します。
通常、withword
が空の場合は次のようになります。
${parameter-}
そして:
$parameter
または:
${parameter}
同等です。
ただし、の影響でset -u
設定されていない変数がある場合、シェルは終了します。${parameter-}
この厳格なルールをバイパスするために使用されます。どちらの場合でも動作するため、これはより正しいアプローチです。