如果文件为空,则退出1,否则继续下一步

时间:2018-12-05 22:47:34

标签: bash subshell

我正在编写bash脚本。

第1步-通过curl提取一些元数据并写入文件。

第2步-检查文件是否为空。          如果文件为空,请注销“文件为空。正在退出...”,并以状态代码1退出。如果文件不为空,请继续执行步骤3。

第3步-进一步处理文件。

所以我试图将步骤2优化为一行。

这是我到目前为止尝试过的。

[ -s sp_metadata.xml ] || echo "ERROR - SP Metadata returned null. Exiting..." && exit 1

现在,如果文件为空,则会得到以下结果。

touch sp_metadata.xml
sh -x ./register.sh
+ [ -s sp_metadata.xml ]
+ echo ERROR - SP Metadata returned null. Exiting...
ERROR - SP Metadata returned null. Exiting...
+ exit 1

但是当我将数据写入文件时,我得到了

echo "Test" > sp_metadata.xml
sh -x ./register.sh
+ [ -s sp_metadata.xml ]
+ exit 1

好像每次都在运行exit 1。我猜这是因为&&

我尝试了

[ -s sp_metadata.xml ] || echo "ERROR - SP Metadata returned null. Exiting..." ; exit 1

也尝试过

[ -s sp_metadata.xml ] || (echo "ERROR - SP Metadata returned null. Exiting..." && exit 1)

但是没有用。任何想法我的语法有什么问题吗?

1 个答案:

答案 0 :(得分:1)

[ -s sp_metadata.xml ] || (echo "ERROR - SP Metadata returned null. Exiting..."; \
  exit 1)

不起作用,因为您正在创建子外壳,因此exit 1基本上终止了该子外壳,但不终止父脚本。

所以您应该尝试:

[ -s sp_metadata.xml ] || { echo "ERROR - SP Metadata returned null. Exiting..."; \
  exit 1; }

这应该可以工作(并且还避免了创建子shell的成本)。

请注意,右括号前的;是强制性的。