変数が定義されていない場合のスクリプト実行の防止

変数が定義されていない場合のスクリプト実行の防止

次のスクリプトがあります。

c=0
for f in */*; do
cp -v "$f" "/myhome/CE$(printf '%0*d' 2 $BATCHNUM)-new-stuctures_extracted/test-$(printf '%0*d' 5 $c)"
c=$((c=c+1))
done

ただし、ユーザーはBATCHNUMを呼び出す変数を提供する必要があります。それ以外の場合は、スクリプトの実行を強制的に停止する必要があります。このスクリプトを呼び出すスクリプト(またはこのスクリプトを呼び出す#2スクリプトを呼び出す#1スクリプト)も強制的に停止できれば、より良いでしょう。

答え1

最速の方法は、おそらくスクリプトの先頭に次の2行を追加することです。

set -u # or set -o nounset
: "$BATCHNUM"

最初の行は、設定nounsetされていない変数を拡張しようとすると、中断されるスクリプトを実行するシェルでオプションを設定します。 2 行目は、$BATCHNUM他の操作を実行する前に中断をトリガーするために、no-op コンテキストで拡張されます。

より便利なエラーメッセージが必要な場合は、次のように書くことができます。

if [[ -z "$BATCHNUM" ]]; then
    echo "Must provide BATCHNUM in environment" 1>&2
    exit 1
fi

またはそのようなもの。

答え2

BATCHNUMここで設定されていて空でないことを確認したいと思います。

POSIX シェルは以下を提供します。パラメータ拡張この仕事のために。使用する前に次の行を追加してくださいBATCHNUM

: "${BATCHNUM:?Variable not set or empty}"

BATCHNUMまたは、ユーザーがデフォルト値を指定していない場合は、デフォルト値を設定することをお勧めします。

: "${BATCHNUM:=3}"

答え3

[ -n "$BATCHNUM" ] || { kill "$PPID"; exit 1; }
#Unless $BATCHNUM is defined and unempty, ask parent process to exit and exit w/ 1

これはbashとPOSIX shの両方で機能します。私は空の変数と未定義の変数を区別するのが好きではありません(例えば、区別しませんが、set -uそれはまさに私です)。

答え4

定義されているかどうかをテストし、BATCHNUMそれ以外の場合は終了します。

if [ -n "${BATCHNUM-a}" ]; then
  echo >&2 "Fatal error: BATCHNUM not set"
  exit 2
fi

BATCHNUMヌルケースも拒否するには、代わりに${BATCHNUM:+a}を使用してください${BATCHNUM+a}${VARIABLE+TEXT_IF_NULL}パラメータ拡張の設定の詳細については、次を参照してください。バッシュマニュアル

親プロセスを終了しないでください。親プロセスが何であるかわかりません。このスクリプトを呼び出すスクリプトを中断する必要がある場合(このスクリプトが中断された場合)、このスクリプトの終了ステータスを確認してください。たとえば、スクリプト#2では次のようになります。

script3 || exit $?

または使用set -eコマンドが失敗(ゼロ以外)の状態を返すと、スクリプトは中断されます。

関連情報