Perl SQL查询失败时要退出的Shell脚本循环文件

Perl SQL查询失败时要退出的Shell脚本循环文件,perl,shell,exit,Perl,Shell,Exit,我们有一个shell脚本,如果任何一个.pl文件失败,它就会停止运行。如果SQL文件存在,我们希望对它们执行相同的操作。不同之处在于,我们并不总是在循环的那个点上有一个SQL文件。因此,我们并不总是有一个文件_num.sql。我们要做的是,如果它存在并且失败,那么退出下面的脚本。我们的结构化方式是在do_updates文件中运行以下内容: my $sqlFile = $updatesdir.'/releaseupdates_02.sql'; system("$drushcmd -r $drupa

我们有一个shell脚本,如果任何一个.pl文件失败,它就会停止运行。如果SQL文件存在,我们希望对它们执行相同的操作。不同之处在于,我们并不总是在循环的那个点上有一个SQL文件。因此,我们并不总是有一个文件_num.sql。我们要做的是,如果它存在并且失败,那么退出下面的脚本。我们的结构化方式是在do_updates文件中运行以下内容:

my $sqlFile = $updatesdir.'/releaseupdates_02.sql';
system("$drushcmd -r $drupalroot -u site.test.admin sql-query --file=$sqlFile") == 0 or die "$drushcmd failed: $?";
因此,在下面的主循环中,如果包含SQL命令的perl脚本失败,我们希望退出循环。假设有一个perl脚本为3和4调用一个php文件,如果出现错误,这是可行的,但是,如果02存在一个SQL文件而不是一个php文件,这是不可行的

# Declare a list of update script file numbers
FILE_NUMS="
  01
  02
  03
  04
"
# Run each update script
for file_num in $FILE_NUMS; do
  ${RELEASEDIR}/do_updates_$file_num.pl
  # Exit if an update script returns and exit status of anything other than zero
  if [ $? -ne 0 ]; then
    exit $?
  fi
done

您的
退出$?
与前一行的退出代码不同。您可以将其简化如下:

${RELEASEDIR}/do_updates_$file_num.pl || exit $?
更好的方法是,通过添加
set-o errexit
来编写健壮的shell脚本,以便在出现第一个错误时退出脚本(但要小心)