次のようなスクリプトを探しています。
if [ "${PS1-}" ]; then
その末尾-
PosixやBashの標準構文とは思えないため、少しバグがあります。これは永遠に存在していたいくつかの難解な構文ですか、それともタイプミスですか?標準/ドキュメントへの参照はいただければ幸いです。
通常、私はそれをコーディングします:
if [ "$PS1" ]; then
どちらがより正しいですか、またはそれらの間に違いがありますか?
これは間違いなく POSIX構文 です。言い換え:
parameter
の場合、${parameter-Word}
を使用
parameter
の値を代入します。Word
に置き換えます。セッションの例:
$ echo "${parameter-Word}"
Word
$ parameter=
$ echo "${parameter-Word}"
$ parameter=value
$ echo "${parameter-Word}"
value
ここでの「Null」は、単に空の文字列を意味します。たとえば、SQLとは異なり、POSIXシェルには特別なnull値はありません。
これは、man bash
の「パラメータ拡張」セクションにも記載されています。
変数拡張${parameter:-Word}
は、設定されている場合は$parameter
の値を使用し、nullでない(空の文字列ではない)場合、それ以外の場合は文字列Word
を使用します。
:
を省略すると、値が空かどうかはテストされません。値が設定されているかどうかだけがテストされます。
つまり、${PS1-}
は、設定されている場合は$PS1
の値に展開され、空または未設定の場合は空の文字列に展開されます。この場合、これは${PS1:-}
の後の文字列も空であるため、-
ととまったく同じです。
@Rakesh Sharmaが指摘しているように、"${PS1-}"
と"$PS1"
の違いはわずかです。どちらも$PS1
の値に展開されるか、設定されていない場合は空の文字列に展開されます。例外は、set -u
がアクティブな場合、 設定されていない変数を展開するとエラーが発生する です。 "${PS1-}"
で設定された(空の)デフォルト値はこれを回避し、未設定のPS1
をエラーなしで空の文字列に拡張します。
これは標準的な構文です ( 70年代後半のBourne Shellで作成されたもの )。他のいくつかの同様の拡張と同様です。
構文:
${parameter:-Word}
そして特別な形:
${parameter-Word}
POSIXシェルで有効な構文 であり、Word
が設定されていないかnullの場合、デフォルト値parameter
を使用することを意味します。
通常、Word
は空の場合、次のようになります。
${parameter-}
そして:
$parameter
または:
${parameter}
同等です。
ただし、set -u
の影響下では、未設定のすべての変数によってシェルが終了します。 ${parameter-}
は、その厳密なルールをバイパスするために使用されます。どちらの場合でも機能するので、はい、より正しい方法です。