Shell脚本:死于任何错误

时间:2008-12-15 15:41:50

标签: bash shell scripting

假设shell脚本(/ bin / sh或/ bin / bash)包含多个命令。如果任何命令的退出状态失败,如何干净地使脚本终止?显然,可以使用if块和/或回调,但是有更清晰,更简洁的方法吗?使用&&也不是一个真正的选择,因为命令可能很长,或者脚本可能有很多非常重要的东西,比如循环和条件。

3 个答案:

答案 0 :(得分:60)

使用标准shbash,您可以

set -e

它会

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

它也适用于(我可以收集的)zsh。它也适用于任何Bourne shell后代。

使用csh / tcsh,您必须使用#!/bin/csh -e启动脚本

答案 1 :(得分:16)

可能你可以使用:

$ <any_command> || exit 1

答案 2 :(得分:1)

你可以检查$?看看最新的退出代码是什么..

e.g

#!/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!"