我有以下代码:
debug=$?
function a {
su - javi -c "uptime"
return $debug
}
function b {
su - javi -c "cat /etc/redhat-release"
return $debug
}
function c {
su - javi -c "cat /etc/redhat-release"
return $debug
}
case $debug in
0)
a
if [ $debug == 0 ]; then
b
echo "se ejcuta la funcion"
elif [ $debug == 0 ]
c
elif[].... <-----this
fi
;;
1)
echo "se ha producido un error"
;;
esac
有没有办法通过删除 if 来进行调试?我希望他们运行一个函数,如果它结束得很好,则跳转到另一个函数,如果它结束得不好,它会留下 escript,即有 5 个函数
答案1
如果目标只是运行每个函数,并避免出现任何错误,也许这样的事情会起作用:
function bail {
echo "se ha producido un error ($1)"
exit 1
}
function a {
uptime
}
function b {
cat /etc/redhat-release
}
function c {
cat /etc/redhat-release
}
for f in 'a' 'b' 'c'; do
$f || bail "$f: $?"
done
这将运行每个函数,如果遇到错误,函数名称和退出代码将发送到该bail
函数,该函数将打印一行并退出任何其他命令。
我确实删除了 的使用,su
因为这样更容易测试。如果您想自动执行此操作,我建议创建一个 sudo 配置文件来以提升的权限运行这些命令,这样您只需输入密码一次,或者根本不需要输入密码。
答案2
debug=$?
不会在每个命令中进行评估。因此 的值debug
在整个脚本中都是相同的。- 函数的返回码是其最后一个命令的返回码。所以 return 语句是没有意义的。
总而言之,类似的东西如果成功a && b && c
就会运行,如果成功就会运行。该复合命令的返回码是每个函数的第一个非零返回码。b
a
c
b