0

朋友们...

我有 bash 脚本,它每次都调用 perl 脚本并通过电子邮件发送日志文件结果。

我想更改我的 bash 脚本,使其仅在 perl 子例程行计数器(rcounter++)中有值时才发送电子邮件,而不是所有时间。

有关如何更改 .ksh 文件的任何提示?

.ksh

#!/bin/ksh
d=`date +%Y%m%d`

log_dir=$HOME
output_file=log.list

if ! list_tables -login /@testdb -outputFile $output_file
   then    
      mailx -s "list report : $d" test@mail < $output_file
 fi

=======Below if condition also works for me=============================

  list_tables -login /@testdb -outputFile $output_file
 if ["$?" -ne "0"];
    then    
          mailx -s "list report : $d" test@mail < $output_file
 fi
========================================================================

Perl 脚本:list_tables

use strict;
use Getopt::Long;

use DBI;
use DBD::Oracle qw(:ora_types);

my $exitStatus = 0;
my %options = ()
my $oracleLogin;
my $outputFile;
my $runDate;
my $logFile;
my $rcounter;

($oracleLogin, $outputFile) = &validateCommandLine();

my $db = &attemptconnect($oracleLogin);

&reportListTables($outputFile);

$db->$disconnect;

exit($rcounter);


#---------------------------
sub reportListTables {

    my $outputFile = shift;

    if ( ! open (OUT,">" . $outputfile)) {
        &logMessage("Error opening $outputFile");
    }

    print OUT &putTitle;

    my $oldDB="DEFAULT";
    my $dbcounter = 0;
    my $i;

    print OUT &putHeader();

    #iterate over results
    for (my $i=0; $i<=$lstSessions; $i++) {
        # print result row
        print OUT &putRow($i);
        $dbCounter++;
    }

    print OUT &putFooter($dbCounter);
    print OUT "   *** Report End \n";

    closeOUT;
}


#------------------------------ 
sub putTitle {
    my $title = qq{
   List Tables: Yesterday
  --------------
};


#------------------------------
sub putHeader {
    my $header = qq{

   TESTDB
  ==============
    OWNER       Table   Created


};

#------------------------------
sub putRow {

    my $indx = shift;
    my $ln = sprintf "%-19s %-30s %-19s",
       $lstSessions[$indx]{owner},
       $lstSessions[$indx]{object_name},
       $lstSessions[$indx]{created};

return "$ln\n";

}

#------------------------------
sub getListTables {

    my $runDt = shift;
       $rcounter = 0;

    my $SQL = qq{
    selct owner, object_name, to_char(created,'MM-DD-YYYY') from dba_objects
    };

    my $sth = $db->prepare ($SQL) or die $db->errstr;

    $sth->execute() or die $db->errstr;;

    while (my @row = $sth->fethcrow_array) {
        $lstSessions[$rcounter] {owner}     =$row[0];
        $lstSessions[$rcounter] {object_name}   =$row[1];
        $lstSessions[$rcounter] {created}   =$row[2];

        &logMessage(" Owner:    $lstSessions[$rcounter]{owner}");
        &logMessage(" Table:    $lstSessions[$rcounter]{object_name}");
        &logMessage(" created:  $lstSessions[$rcounter]{created}");

        $rcounter++;
    }

    &logMessage("$rcounter records found...");

}

谢谢..

如果这让生活更轻松,也很高兴在 perl 中包含 mail-x 部分..

4

1 回答 1

0

我不确定我是否正确理解了您的问题。另外,您的代码不完整。所以有一些猜测。


不能从调用方检查本地 Perl 变量的值。

但是,如果您的问题是 Perl 代码是否在日志文件中添加了任何内容,则解决方案很简单:删除“rcounter records found...”行(无论如何它都没有意义,因为它总是执行,查询是否返回结果或不)。然后,让 shell 脚本在调用 Perl 之前备份日志文件,然后再做一个diff,只有在diff告诉你日志文件中添加了输出时才发送邮件。

如果这对您没有帮助,请澄清问题。

编辑(来自下面的评论):

Shell 脚本编写并不难。现在,您的 Perl 脚本以:

$db->($exitStatus);

那是您的退出代码。无论如何,您都不会在您的 shell 脚本中检查它,因此您可以将其更改为更有用的东西,例如写入的数据行数。一个原始的解决方案是通过在 Perl 脚本的顶部(例如 after )声明它来使其成为$rcounter全局的(而不是局部的)。然后你可以简单地替换上面的“exitStatus”行:getListTables()my $logFile;

$rcounter;         

瞧,您的 Perl 脚本现在返回写入的数据行数。

在 Perl 中,返回码 0 被认为是失败,任何其他值都是成功。在 shell 中,情况正好相反——但幸运的是,您不必担心这一点,因为 Perl 知道这一点,并且在返回调用 shell 时会“反转”(否定)脚本的返回码。

所以你所需要的只是让邮件依赖于 Perl 的非零返回:

if list_tables -login /@testdb -outputFile $output_file
then
    mailx -s "list report : $d" test@mail < $output_file
fi

旁边的评论:在我看来,您的编程技能与您要解决的问题的范围不符。如果从 Perl 向 bash 返回一个值会给您带来这么多麻烦,那么您可能应该将时间花在教程上,而不是从数据库获取输入和发送电子邮件。在尝试飞行之前先学会走路...

于 2013-03-11T15:11:14.187 回答