Bash脚本函数验证

问题描述:

我想对脚本中调用的每个函数进行验证,并在一个函数失败时将整个脚本错误地排除。Bash脚本函数验证

寻找最好的方法来做到这一点。我觉得我知道一次很好的做法,但不能再搞清楚。

我可以暴力,但它是讨厌的。这是我如何能得到它的正常工作

copy_files $1 
    if [ "$?" -ne "0" ]; then 
      error "Copying files" 
      return -1 
    fi 

这变得很丑陋,因为我有一个脚本,云:

命令1 命令2 命令3

有包裹与回报所有这些命令不是很理想。 :(请帮助!

command1 || (error "Cmd1 fail"; return -1); command2 || (error "Cmd2 fail"; return -1); 

等等等等。||运营商表示,如果前一个命令失败的下一个命令将只执行。&&是相反的。括号组的命令来运行。

+0

+ 1代表'||',但我建议将'return -1'改为'exit 1'(1是错误代码的标准选择)。这可以让你定义一个名为'die'的函数来处理退出的部分,然后你可以写'command1 || die'和'command2 ||死亡“等。这是一个相当普遍的做法。 – 2010-07-10 23:18:27

+0

我喜欢这个......但是我正在运行我的脚本。 ./myscript.sh。如果我在死亡的时候出口1,它会杀死我的整个航站楼。有关如何退出脚本而不会从脚本中终止我的终端的任何想法? – 2010-07-10 23:56:05

你可以做这样的事情:

good() { 
    return 0; 
} 

bad() { 
    return 5; 
} 

wrapper() { 
    $1 

    rc=$? 

    if [ "$rc" -ne "0" ]; then 
      echo "error: $1 returned $rc" 
      exit -1 
    fi 
} 


wrapper bad 
wrapper good 

,或者,如果你可以传递的功能列表,像这样:

wrapper() { 
    for f in $*; do 

     $f 
     rc=$? 

     if [ "$rc" -ne "0" ]; then 
       echo "error: $f returned ${rc}" 
       return -1 
     fi 
    done 
    return 0; 
} 


wrapper good bad 

if [ "$?" -ne "0" ]; then 
    #error handling here 
    exit -1; 
fi 

既然你说你想在一个脚本每一个命令做到这一点,你可以在开头插入

set -e 

。如果任何命令返回0以外的状态码,该调用立即退出。(例外:作为条件语句中测试的一部分的命令,以及后面跟着&&||或其他命令的命令)

+0

如果你这样做,考虑设置PS4更好的跟踪。导出PS4 ='+ $ {BASH_SOURCE}:$ {LINENO}:$ {FUNCNAME [0]}:'。根据http://aymanh.com/how-debug-bash-scripts – 2010-08-13 21:40:37