web-dev-qa-db-ja.com

$ {var?}のようにbash変数パラメーター展開の疑問符の意味は何ですか?

このように使用されるbash変数の意味は何ですか?

 ${Server?}
38
Kai

bashマンページから)とほぼ同じように機能します。

${parameter:?word}
Display Error if Null or Unset. If parameter is null or unset, the expansion of Word (or a message to that effect if Word is not present) is written to the standard error and the Shell, if it is not interactive, exits. Otherwise, the value of parameter is substituted.

その特定のバリアントは、変数が存在することを確認します(定義されており、nullではありません)。もしそうなら、それを使用します。そうでない場合は、Word(またはWordがない場合は適切なメッセージ)で指定されたエラーメッセージを出力し、スクリプトを終了します。

それと非コロンバージョンの実際の違いは、引用されたセクションの上のbashマンページにあります。

部分文字列展開を実行しない場合、以下に説明するフォームを使用して、bashは未設定またはnullのパラメーターをテストします。 コロンを省略すると、設定されていないパラメーターに対してのみテストが行​​われます。

言い換えると、上記のセクションは次のように変更できます(基本的に「null」ビットを削除します)。

${parameter?word}
Display Error if Unset. If parameter is unset, the expansion of Word (or a message to that effect if Word is not present) is written to the standard error and the Shell, if it is not interactive, exits. Otherwise, the value of parameter is substituted.

このように違いが示されています。

pax> unset xyzzy ; export plugh=

pax> echo ${xyzzy:?no}
bash: xyzzy: no

pax> echo ${plugh:?no}
bash: plugh: no

pax> echo ${xyzzy?no}
bash: xyzzy: no

pax> echo ${plugh?no}

pax> _

ここで、未設定null変数の両方が:?でエラーになるのに対し、未設定の1つだけが?でエラーになることがわかります。

49
paxdiablo

これは、変数が定義されていない場合、スクリプトを中止する必要があることを意味します

例:

#!/bin/bash
echo We will see this
${Server?Oh no! server is undefined!}
echo Should not get here

このスクリプトは、最初のエコーと「Oh no!...」エラーメッセージを出力します。

ここでbashのすべての変数置換を参照してください: https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html

14
Robert I. Jr.