web-dev-qa-db-ja.com

シェルスクリプト:エラーが発生すると死にます

シェルスクリプト(/ bin/shまたは/ bin/bash)にいくつかのコマンドが含まれているとします。コマンドのいずれかに失敗した終了ステータスがある場合、スクリプトをきれいに終了させるにはどうすればよいですか?明らかに、ifブロックやコールバックを使用できますが、より簡潔で簡潔な方法はありますか?コマンドが長くなる場合や、スクリプトにループや条件などの重要な機能が含まれる場合があるため、&&の使用も実際にはオプションではありません。

36
Pistos

標準のshおよびbashでは、次のことができます

set -e

そうなる

$ help set
...
        -e  Exit immediately if a command exits with a non-zero status.

(私が集めることができるものから)zshでも機能します。また、Bourne Shellの子孫でも機能するはずです。

csh/tcshでは、#!/bin/csh -eを使用してスクリプトを起動する必要があります

63
mat

あなたが使うことができるかもしれません:

$ <any_command> || exit 1
19
Barun

あなたは$をチェックできますか?最新の終了コードを確認するには..

例えば

#!/bin/sh
# A Tidier approach

check_errs()
{
  # Function. Parameter 1 is the return code
  # Para. 2 is text to display on failure.
  if [ "${1}" -ne "0" ]; then
    echo "ERROR # ${1} : ${2}"
    # as a bonus, make our script exit with the right error code.
    exit ${1}
  fi
}

### main script starts here ###

grep "^${1}:" /etc/passwd > /dev/null 2>&1
check_errs $? "User ${1} not found in /etc/passwd"
USERNAME=`grep "^${1}:" /etc/passwd|cut -d":" -f1`
check_errs $? "Cut returned an error"
echo "USERNAME: $USERNAME"
check_errs $? "echo returned an error - very strange!"
0
f0ster