我正在写一个shell脚本,需要检查终端应用程序是否已安装。我想使用TRY/CATCH命令来做到这一点,除非有更整洁的方法。


当前回答

Bash中有TRY CATCH命令吗?

不。

Bash不像在许多编程语言中那样拥有那么多奢侈的东西。

bash中没有try/catch;但是,可以使用&&或||实现类似的行为。

使用| |:

如果command1失败,则command2按如下方式运行

command1 || command2

类似地,使用&&,如果command1成功,command2将运行

try/catch最接近的近似如下

{ # try

    command1 &&
    #save your output

} || { # catch
    # save log for exception 
}

此外,bash还包含一些错误处理机制

set -e

如果任何简单的命令失败,它将停止脚本。

还有为什么不是if…else。它是你最好的朋友。

其他回答

Bash中有TRY CATCH命令吗?

不。

Bash不像在许多编程语言中那样拥有那么多奢侈的东西。

bash中没有try/catch;但是,可以使用&&或||实现类似的行为。

使用| |:

如果command1失败,则command2按如下方式运行

command1 || command2

类似地,使用&&,如果command1成功,command2将运行

try/catch最接近的近似如下

{ # try

    command1 &&
    #save your output

} || { # catch
    # save log for exception 
}

此外,bash还包含一些错误处理机制

set -e

如果任何简单的命令失败,它将停止脚本。

还有为什么不是if…else。它是你最好的朋友。

有很多类似的解决方案可能会起作用。下面是一个简单有效的方法来完成try/catch,并在评论中进行了解释。

#!/bin/bash

function a() {
  # do some stuff here
}
function b() {
  # do more stuff here
}

# this subshell is a scope of try
# try
(
  # this flag will make to exit from current subshell on any error
  # inside it (all functions run inside will also break on any error)
  set -e
  a
  b
  # do more stuff here
)
# and here we catch errors
# catch
errorCode=$?
if [ $errorCode -ne 0 ]; then
  echo "We have an error"
  # We exit the all script with the same error, if you don't want to
  # exit it and continue, just delete this line.
  exit $errorCode
fi

我建议在“bash -ue”模式下这样做:

set -ue
   
false && RET=$? || RET=$? 
echo "expecting 1, got ${RET}"
true && RET=$? || RET=$? 
echo "expecting 0, got ${RET}"

echo "test try...catch"
false && RET=$? || RET=$? 
if [ ${RET} -ne 0 ]; then
  echo "caught error ${RET}"
fi

echo "beware, using '||' before '&&' fails"
echo "  -> memory aid: [A]nd before [O]r in the alphabet"
false || RET=$? && RET=$? 
echo "expecting 1, got ${RET}"
true || RET=$? && RET=$? 
echo "expecting 0, got ${RET}"

你可以:

#!/bin/bash
if <command> ; then # TRY
    <do-whatever-you-want>
else # CATCH
    echo 'Exception'
    <do-whatever-you-want>
fi

我使用的方法是这样的:

YOUR COMMAND HERE
EXITCODE=$?
if [ "$EXITCODE" -ne "0" ]; then
    #this is the catch part
    echo "uh oh"
    exit $EXITCODE
fi

这只是检查命令的退出码,并将其与零进行比较 (表示命令运行成功)