【发布时间】:2013-03-11 14:42:44
【问题描述】:
朋友...
我有 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 部分,如果这样可以让生活更轻松..
【问题讨论】:
-
您忘记插入变量
$SQL和$rcounter(使用了裸字SQL和字符串rcounter),并且您声明了$rounter,但使用了$rcounter。使用全局变量@lstSessions很可能是一个非常糟糕的主意。使用use strict; use warnings;,并修复产生的警告/错误。 -
感谢 TLP 的 cmets...实际上我在原始代码中使用了 $SQL、$rcounter、严格和警告...这是错字,因为我没有复制粘贴代码...如果记录计数器中有值,您知道如何仅通过 .ksh 发送电子邮件吗?
-
我认为
list_tables是您的 Perl 脚本的名称,但您实际上并没有这么说。为什么不把所有的逻辑都放到 Perl 脚本中呢?如果 Perl 脚本在其他地方使用,也许您可以添加一个选项,告诉它适当地调用mailx。 -
按照建议完成所有逻辑和文件名...谢谢