847

いくつかのコードをテストするために Bash でスクリプトを書いています。ただし、そもそもコードのコンパイルに失敗した場合にテストを実行するのはばかげているように思われます。その場合は、テストを中止します。

スクリプト全体を while ループ内にラップしてブレークを使用せずにこれを行う方法はありますか? ドンドンドンゴトみたいなもの?

4

8 に答える 8

989

次のステートメントを試してください。

exit 1

1適切なエラー コードに置き換えます。特別な意味を持つ終了コードも参照してください。

于 2009-09-04T09:53:53.160 に答える
754

set -eを使用

#!/bin/bash

set -e

/bin/command-that-fails
/bin/command-that-fails2

スクリプトは、失敗した最初の行の後に終了します (0 以外の終了コードを返します)。この場合、command-that-fails2は実行されません。

すべてのコマンドの戻りステータスを確認する場合、スクリプトは次のようになります。

#!/bin/bash

# I'm assuming you're using make

cd /project-dir
make
if [[ $? -ne 0 ]] ; then
    exit 1
fi

cd /project-dir2
make
if [[ $? -ne 0 ]] ; then
    exit 1
fi

set -eを使用すると、次のようになります。

#!/bin/bash

set -e

cd /project-dir
make

cd /project-dir2
make

コマンドが失敗すると、スクリプト全体が失敗し、$?で確認できる終了ステータスが返されます。. スクリプトが非常に長い場合、または多くのものを作成している場合、リターン ステータス チェックをあらゆる場所に追加すると、かなり見苦しくなります。

于 2009-09-04T15:18:22.870 に答える
14

多くの場合、エラーを処理するために run() という関数を含めます。実行したい呼び出しはすべてこの関数に渡されるため、障害が発生するとスクリプト全体が終了します。set -e ソリューションに対するこの利点は、回線が失敗したときにスクリプトが黙って終了せず、問題が何であるかを知らせることができることです。次の例では、false の呼び出しでスクリプトが終了するため、3 行目は実行されません。

function run() {
  cmd_output=$(eval $1)
  return_value=$?
  if [ $return_value != 0 ]; then
    echo "Command $1 failed"
    exit -1
  else
    echo "output: $cmd_output"
    echo "Command succeeded."
  fi
  return $return_value
}
run "date"
run "false"
run "date"
于 2013-09-18T19:21:51.900 に答える