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);
等等等等。||
运营商表示,如果前一个命令失败的下一个命令将只执行。&&
是相反的。括号组的命令来运行。
答
你可以做这样的事情:
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
+ 1代表'||',但我建议将'return -1'改为'exit 1'(1是错误代码的标准选择)。这可以让你定义一个名为'die'的函数来处理退出的部分,然后你可以写'command1 || die'和'command2 ||死亡“等。这是一个相当普遍的做法。 – 2010-07-10 23:18:27
我喜欢这个......但是我正在运行我的脚本。 ./myscript.sh。如果我在死亡的时候出口1,它会杀死我的整个航站楼。有关如何退出脚本而不会从脚本中终止我的终端的任何想法? – 2010-07-10 23:56:05