在上一个命令返回非零值之后,如何让我的脚本在中止之前再执行一个命令?

在上一个命令返回非零值之后,如何让我的脚本在中止之前再执行一个命令?

我有一个 shell 脚本,它调用 Perl 脚本来执行一些文件处理。 Perl 脚本以零或一值退出。set -e如果 Perl 脚本以值 1 退出,我在脚本开头有 Unix命令来中止脚本。我只是想知道 Unix 中是否有任何命令可以使用,如果 Perl 脚本以一个值退出,则在脚本中止之前执行一个命令?本质上,我希望脚本向我发送一封电子邮件,说明 Perl 脚本是否成功运行。我的代码现在看起来像这样:

#!/bin/bash

set -e

function email_success {
#Some code for the email 
}

function email_fail {
#Some code for the email
}

usr/bin/perl perlscript.pl

if [$? -eq 0]; then 
 email_success
else 
 email_fail
fi 

#More commands to be executed if its successful 

答案1

只是不要使用set -e并添加退出到您的if失败分支。如果您希望脚本的其余部分具有该行为,请set -e在电子邮件通话后添加。

答案2

使用set -e

你可以写:

#!/bin/bash
set -e

# function email_success {...}

# function email_fail { ... }

if /usr/bin/perl perlscript.pl; then
  email_success
else
  email_fail
  exit 1
fi

#More commands to be executed if its successful 

解释:

Bash 参考手册说:

-e如果管道(可能由单个简单命令组成)返回非零状态,请立即退出。贝壳不退出如果失败的命令是语句中测试的一部分if

条件结构 (if):

if 命令的语法是

if test-commands; then
  consequent-commands;
[elif more-test-commands; then
  more-consequents;]
[else alternate-consequents;]
  fi

执行测试命令列表,如果其返回状态为零,则执行后续命令列表。如果存在“else alter-consequents”,并且最后的 if 或 elif 子句中的最终命令具有非零退出状态,则执行替代结果。

也可以看看:使用非官方的 Bash 严格模式(除非您喜欢调试)

相关内容