「$ {PS1-}」は有効な構文であり、プレーンな「$ PS1」とどのように違いますか?


12

私が持っているスクリプトを見ています:

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

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

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

if [ "$PS1" ]; then

どちらが正しいのですか、それとも違いがありますか?

回答:


12

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

を使用${parameter-word}する場合parameter

  • 設定していないヌル、その後の値を代入しparameter
  • nullに設定してから、nullに置き換え、
  • 設定解除してから、を置き換えwordます。

セッションの例:

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

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

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

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


1
bashとdashのマンページは、この構文(奇数)に言及していないため、不完全だと思います!
グレゴール

1
@Gregor両方のマニュアルでこれが言及されています。Bashマニュアルでは、パラメータ展開のリストの前の段落にあり、Dashマニュアルでは、後の段落にあります。
クサラナンダ

1
わかりました、「コロンを省略します....」私はそれを見ませんでした:(
グレゴール

zsh私が知っている唯一のシェルは、コロンを省略したことを単にメモするのではなく、コロンなしのバリアントを明示的に言及しています。
-chepner

1
@ pts、POSIXのテキストは「null」という用語をほとんど排他的に使用しています。これは、manページでの使用を説明している可能性があります。
イルッカチュ

23

変数展開で${parameter:-word}は、値が$parameter設定されている場合はnull以外の値(空の文字列ではない)が使用され、そうでない場合はstringが使用されますword

を省略する:と、値が空であるかどうかはテストされず、設定されていないかどうかのみがテストされます。

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

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

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


そして、引用された"$PS1"ので、if PS1と同じです。ifが空の場合は空であり、引用符は単語が完全に消えないようにします。
イルッカチュ

4
set -uが有効でない限り。nounsetオプションがオンの場合、「$ PS1」=>はエラーを返します。「$ {PS-}」は使用できません。

@RakeshSharmaそれは良い点です。構文が異なると、実際にはnounsetオプションに応じて異なる結果が得られる可能性があるため、テスト["$ {parameter-}"]はおそらくより正確です!
グレゴール

1
@Kusalananda:NULL以外の場合${parameter:-word}の値を使用することに注意してください$parameter。他のすべての場合(意味:設定されているがNULLまたは未設定のいずれか)を使用しますword。あなたの言い回し:if its set or null

@ikkachu:はい、そうです。変数がset AND nonnull=>の場合のみ、それ自体を使用します。それ以外の場合、(set but NULL OR unset)=>単語を使用します。

6

構文:

${parameter:-word}

そして特別な形式:

${parameter-word}

POSIXシェルの有効な構文でありwordparameterが未設定またはヌルの場合にデフォルト値を使用することを意味します。


通常、with wordは空の場合:

${parameter-}

そして:

$parameter

または:

${parameter}

同等です。

ただし、の効果によりset -u、設定されていない変数はすべてシェルを終了させます。${parameter-}その厳格なルールをバイパスするために使用されます。どちらの場合でも動作するので、はい、より正確な方法です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.