スクリプトのある時点で、構成ファイル以降に複数の変数が設定されていることを確認しsource
、設定されていない場合、ユーザーに欠落している変数について知らせる実行を停止したいと思います。頑張りました
for var in $one $two $three ; do
...
ただし、exampleが$two
設定されていないと、forループは実行されません$two
。私が試した後、
for var in one two three ; do
if [ -n ${!var} ] ; then
echo "$var is set to ${!var}"
else
echo "$var is not set"
fi
done
ただし、2が設定されていない場合でも、「2が設定されていません」の代わりに「2に設定されています」と表示されます。
すべての必須変数が設定されているかどうかを確認できますか?
アップデート/ソリューション:「セット」と「セットですが空」の違いがあることを知っています。今使っています(ありがとうございますhttps://stackoverflow.com/a/16753536/3456281そして、この質問に対する答え)は次のようになります。
if [ -n "${!var:-}" ] ; then
したがってvar
、設定されているが空の場合はまだ無効と見なされます。
答え1
引用エラーです。
if [ -n "${!var}" ] ; then
将来の保証:設定
set -x
コードを実行する前に問題が表示されます。コードに追加する代わりに、次のようにスクリプトを呼び出すことができます。
bash -vx ./my/script.sh
答え2
プログラムを停止するには:
N=
${one?var 1 is unset}
${two:?var 2 is unset or null}
${three:+${N:?var 3 is set and not null}}
それはすべてです。疑問符の後の各メッセージは、次に印刷されます。stderr
と親シェル死んだ。わかりました。各メッセージ - 1つのみ - 最初の失敗のみメッセージを印刷してシェルを終了します。私はこれらのテストを次のように使用するのが好きです。
( for v in "$one" "$two" "$three" ; do
i=$((i+1)) ; : ${v:?var $i is unset or null...}
done ) || _handle_it
これについては言うべきことがたくさんあります。ここ。
答え3
必要な唯一のものはテストの引用です。
for var in one two three ; do
if [ -n "${!var}" ] ; then
echo "$var is set to ${!var}"
else
echo "$var is not set"
fi
done
私のために動作します。
答え4
追加できます
set -u
設定されていない変数を使用しようとすると、スクリプトが終了するようにスクリプトの先頭に追加します。
このようなスクリプト
#!/bin/sh
set -u
echo $foo
結果は次のとおりです。
script.sh: 3: script.sh: foo: パラメーターが設定されていません。
代わりに使用すると、bash
エラーは次のようになります。
script.sh: 行3: foo: バインドされていない変数