如何在bash中“尝试做某事然后检测它是否失败”?

时间:2011-08-31 01:19:21

标签: bash if-statement try-catch

在对上一个问题的回答中:

How can I use 'do I have root access?' as a conditional in bash?

建议“尝试做某事并检测是否失败”而不是“检查权限然后做某事”

我已经找到了足够的理由,例如:

但是,我发现很少有关于如何在bash中实现try / catch的明确信息。我猜这太容易了,除了我发现的东西看起来相当复杂 - 使用函数或其他脚本:

我对bash相对较新,但对于其他语言中没有与try函数类似的简单函数感到困惑。

具体来说,我想做以下事情:

CMD=`./path/to/script.sh`
if [ <echo $CMD | grep error is true> ]; then
        .. do this ..
else 
        .. do that ..
fi   

3 个答案:

答案 0 :(得分:6)

if sudo chmod a-x /etc/shadow 2>/dev/null
then : Yes - I have root permissions
else : No - I do not have root permissions or /etc/shadow does not exist or ...
fi

如果成功,选择一个不会造成损害的操作(阴影密码文件不应该是可执行的;你可以执行类似chmod o-w /的操作 - 如果你愿意,可以从根目录中删除公共写入权限),并通过查看命令的退出状态来检查它是否有效。这会抛弃错误消息 - 您必须决定是否重要。

'sudo'是为了提高特权;如果你认为用户应该已经是'root',那么省略'sudo'。

答案 1 :(得分:1)

Bash取决于退出状态,因此没有任何try/catch等效项。但它仍然能够满足您的需求。

对于简单的情况,您可以使用

[[ your_test_expression ]] && commands

这相当于

if [[ your_test_expression ]]; then
    commands
fi

If使用[[...]]的“退出状态”,所以实际上你可以在if之后使用任何命令。只需确保您的控制逻辑取决于命令的退出状态。

对于复杂的情况,您仍然需要 if case 语句来表达您的逻辑。

答案 2 :(得分:0)

除非您调用的脚本具有退出条件,否则您无能为力。但是在bash手册页中查找“set”。

set -e
如果脚本中的简单命令失败,

将导致脚本退出。您可以将它添加到示例中的script.sh顶部,以使其在失败时退出。

还要看陷阱。我相信

trap 'exit 2' ERR

类似