sh - || 中的 {} 和 () shell脚本中的语句
问题描述
我正在编写一个在某些情况下应该退出的 shell 脚本,我当前的代码是:
set -e
Running A || (echo "failed to run A"; exit 1)
Running B || (echo "failed to run B"; exit 1)
if Condition C
then
Running D || (echo "failed to run D"; exit 1)
....
它按预期工作,如果 A/B 运行良好,则通过,如果 A 或 B 失败,则为我回显消息,但我尚未测试 D 失败。我的理解是如果A或B失败,会在“||”之后去代码,回显错误,然后退出子shell并返回false。所以整行是“false||false”所以它退出了,因为我在开头有“set -e”。但是后来我读了如果命令失败如何退出? 它提到“set -e”是危险的,因为它不会在 if 语句中被触发,所以这是否意味着如果我的“运行 D”命令失败,它将无法工作?(意味着它不会退出并将继续执行下一个命令)。另外,我尝试按照上述帖子的建议使用 {},但这很奇怪。如果我将其更改为:
#set -e
Running A || {exit 1}
正确,意思是如果A成功,继续下一个命令,如果A失败,退出脚本。但如果我改为
#set -e
Running A || {echo "running A failed";exit 1}
无论 A 成功或失败,它总是在这里退出。
怎么了?我现在也有点困惑,在我的情况下,最好的退出方式是什么?我应该使用“set -e”还是“{}”?谢谢!
解决方案
Using(
)
会产生一个子 shell,而 using{
}
不会,后者允许封闭exit
直接终止您的脚本。
使用的组命令语法{
}
对语法有点挑剔。您必须使用空格将大括号字符与其他字符分开。您还需要在组中的最后一个命令之后使用尾随分号。
鉴于上述限制,请尝试更改:
Running A || {echo "running A failed";exit 1}
... 至:
Running A || { echo "running A failed";exit 1; }
推荐阅读
- google-cloud-platform - 跟踪截止日期以发送提醒的设计模式
- node.js - NodeJS:在上传到 S3 之前如何压缩流?
- virtual-machine - 检测远程桌面连接窗口的最小化
- java - 无法使用 recyclerview 上的改造显示来自 API 的数据
- r - 如何在 Rmarkdown 中“装箱”“summary()”的输出
- c - 不使用 print 语句给出输出
- python - Selenium Python 在 VPS 中设置 Chrome 默认下载目录
- python-3.x - 在多线程上执行查询时,它说连接池已用尽
- python - 将对象附加到列表
- sql - 如何根据 SQL 中多列的条件仅连接 1 列?