我正在写一个shell脚本,需要检查终端应用程序是否已安装。我想使用TRY/CATCH命令来做到这一点,除非有更整洁的方法。
当前回答
假设终端应用名为'app'(你希望它在你的$PATH中):
if [[ ! `which app` ]]; then
# run code if app not installed
else
# run code if app is installed
fi
其他回答
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。它是你最好的朋友。
根据我在这里找到的一些答案,我为自己的项目制作了一个小的帮助文件:
trycatch.sh
#!/bin/bash
function try()
{
[[ $- = *e* ]]; SAVED_OPT_E=$?
set +e
}
function throw()
{
exit $1
}
function catch()
{
export ex_code=$?
(( $SAVED_OPT_E )) && set +e
return $ex_code
}
function throwErrors()
{
set -e
}
function ignoreErrors()
{
set +e
}
下面是它在使用中的示例:
#!/bin/bash
export AnException=100
export AnotherException=101
# start with a try
try
( # open a subshell !!!
echo "do something"
[ someErrorCondition ] && throw $AnException
echo "do something more"
executeCommandThatMightFail || throw $AnotherException
throwErrors # automaticatly end the try block, if command-result is non-null
echo "now on to something completely different"
executeCommandThatMightFail
echo "it's a wonder we came so far"
executeCommandThatFailsForSure || true # ignore a single failing command
ignoreErrors # ignore failures of commands until further notice
executeCommand1ThatFailsForSure
local result = $(executeCommand2ThatFailsForSure)
[ result != "expected error" ] && throw $AnException # ok, if it's not an expected error, we want to bail out!
executeCommand3ThatFailsForSure
# make sure to clear $ex_code, otherwise catch * will run
# echo "finished" does the trick for this example
echo "finished"
)
# directly after closing the subshell you need to connect a group to the catch using ||
catch || {
# now you can handle
case $ex_code in
$AnException)
echo "AnException was thrown"
;;
$AnotherException)
echo "AnotherException was thrown"
;;
*)
echo "An unexpected exception was thrown"
throw $ex_code # you can rethrow the "exception" causing the script to exit if not caught
;;
esac
}
有很多类似的解决方案可能会起作用。下面是一个简单有效的方法来完成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
我用了一个非常简单的方法:
try() {
"$@" || (e=$?; echo "$@" > /dev/stderr; exit $e)
}
假设终端应用名为'app'(你希望它在你的$PATH中):
if [[ ! `which app` ]]; then
# run code if app not installed
else
# run code if app is installed
fi