複数の変数が設定されているかテスト

複数の変数が設定されているかテスト

スクリプトのある時点で、構成ファイル以降に複数の変数が設定されていることを確認し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: バインドされていない変数

関連情報