bash脚本:从一个语句块中捕获错误

时间:2011-07-19 18:38:52

标签: debugging bash shell iptables

我有一个大的iptables规则集,我用自己的bash脚本管理。脚本中的大多数命令都是简单的单一语句iptables命令。我正在尝试通过在脚本执行时添加成功/失败输出来改进脚本。

我将脚本分成不同的部分。一个例子是FORWARD链部分,其中所有规则都应用于FORWARD链。在本节的开头,我输出脚本已经开始应用FORWARD规则,最后,我想输出是否所有规则都成功应用,或者是否有任何规则不起作用。这是基本的想法:

#Start FORWARD section
echo -ne "Applying FORWARD rules..."

#rule 1
/sbin/iptables -A FOWRARD...

#rule 2
/sbin/iptables -A FORWARD...

echo -ne "\t\t\t[OK]\n"

我想要做的是捕获每个iptables命令可能导致的任何输出或错误,并将它们存储在数组或其他内容中。然后在块的末尾,使用if语句来评估数组以查看是否存在任何错误。如果没有,输出[OK]状态,如果有,输出[FAILED]状态并显示相关错误。

有没有办法可以为整个规则块执行此操作,而无需将每个iptables规则包含在if [$? != 0]表达?

1 个答案:

答案 0 :(得分:2)

set -e选项(第一次失败时退出)或:

怎么办?
#rule 1
/sbin/iptables -A FORWARD ... &&

#rule 2
/sbin/iptables -A FORWARD ... &&

echo "[OK]"

假设每个命令都识别出错误,除非一切正常,否则你不会看到OK。

如果您必须处理具有非零但成功的退出状态的顽固流程,那么您将此类命令嵌入到处理该问题的子shell中:

#rule 1
/sbin/iptables -A FORWARD ... &&

#rule 2
/sbin/iptables -A FORWARD ... &&

# Unusual process - finagle-it returns status 17 on success
(
/usr/local/sbin/finagle-it ...
if [ $? = 17 ]; then exit 0; else exit 1; fi
) &&

echo "[OK]"

请注意,在set -e运行时,必须取消finagle-it - 在子shell中。