首页 > 解决方案 > 如果文件为空则退出 1 否则继续下一步

问题描述

我正在编写一个 bash 脚本。

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

第 2 步 - 检查文件是否为空。如果文件为空,则退出“File is empty. Exiting...”并以状态码 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)

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

标签: bashsubshell

解决方案


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

不起作用,因为您正在创建一个子shell,所以exit 1基本上终止了子shell,而不是父脚本。

所以你应该尝试:

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

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

应该注意的是,;右大括号之前是强制性的。


推荐阅读