変数が定義されていない場合、スクリプトを実行しないでください


17

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

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スクリプト)を強制的に停止させることができればさらに良いでしょう。

回答:


28

最も簡単な方法は、おそらく次の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

または類似。


17

ここでチェックしたいのBATCHNUMはnullではなく設定されています。

POSIXシェルは、このジョブのパラメーター拡張を提供します。使用する前にこの行を追加するだけBATCHNUMです:

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

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

: "${BATCHNUM:=3}"

4
[ -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、それは私だけです)。


2

台詞

if [ -z "$BATCHNUM" ]; then
    exit 2;
fi

emptyを確認してください$BATCHNUM。では$PPID、あなたは(自分の親にあなたが好きな害を行うことができますkill $PPID)。祖父母を殺害するには、のデータを調べるなど、他の方法でプロセスIDを取得する必要があります/proc/$PPID

ただし、親が死亡すると、親にシグナル(SIGHUP)が送信されるため、誰かを殺す前にトラップする必要があります。

trap '' SIGHUP

更新:両親を殺さなければならないと思うなら、あなたはそれを間違っている。意味のある終了コードを返すだけです。親スクリプトは、呼び出されたスクリプトの戻りコードを確認し、それに応じて対応する必要があります。


1
少し残忍な.... :)
user40780

1

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}パラメータ展開構造の詳細については、たとえばbashのマニュアルを参照してください。

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

script3 || exit $?

またはset -e、コマンドが失敗(ゼロ以外)ステータスを返した場合にスクリプトを中止するために使用します。

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