我正在写一个shell脚本,需要检查终端应用程序是否已安装。我想使用TRY/CATCH命令来做到这一点,除非有更整洁的方法。
当前回答
我用了一个非常简单的方法:
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
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。它是你最好的朋友。
你可以:
#!/bin/bash
if <command> ; then # TRY
<do-whatever-you-want>
else # CATCH
echo 'Exception'
<do-whatever-you-want>
fi
有很多类似的解决方案可能会起作用。下面是一个简单有效的方法来完成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
你可以使用trap:
try {block A} catch {block B} finally {block C}
翻译:
(
set -Ee
function _catch {
block B
exit 0 # optional; use if you don't want to propagate (rethrow) error to outer shell
}
function _finally {
block C
}
trap _catch ERR
trap _finally EXIT
block A
)
推荐文章
- 如何从查找“类型d”中排除此/ current / dot文件夹
- 检查bash变量是否等于0
- 只使用md5sum获取哈希值(没有文件名)
- 如何生成一个核心转储在Linux上的分段错误?
- 使用sh shell比较字符串
- 在Bash中测试非零长度字符串:[-n "$var"]或["$var"]
- 如何删除超过X小时的文件
- 如何创建Bash别名?
- 如何设置ssh超时时间?
- 将所有变量从一个shell脚本传递到另一个?
- 捕获所有JavaScript错误并将其发送到服务器
- 只列出UNIX中的目录
- 如何删除shell脚本中文件名的扩展名?
- 使用xargs调用shell函数
- 如何限制从grep返回的结果的数量?