0

友達...

perlスクリプトを呼び出してログファイルの結果を毎回メールで送信するbashスクリプトがあります。

perlサブルーチン行カウンター(rcounter ++)に値があり、常にではない場合にのみ電子メールを送信するように、bashスクリプトを変更したいと思います。

.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...");

}

ありがとう..

また、mail-xの部分をperlに含めると、作業がより簡単になります。

4

1 に答える 1

0

私はあなたの質問を正しく理解したかどうかわかりません。また、コードが不完全です。したがって、いくつかの推測が含まれます。


呼び出し側からローカルPerl変数の値を確認することはできません。

しかし、Perlコードがログファイルに何かを追加したかどうかという質問の場合、解決策は簡単です。「rcounter records found ...」行を削除します(クエリが結果を返したかどうかに関係なく、常に実行されるため、とにかく意味がありません)。か否か)。次に、シェルスクリプトでPerlを呼び出す前にログファイルをバックアップし、後でログファイルに出力が追加されたことが通知されdiffた場合にのみメールを送信します。diff

それでも問題が解決しない場合は、質問を明確にしてください。

編集(以下のコメントから):

シェルスクリプトはそれほど難しくありません。現在、Perlスクリプトは次のように終了します。

$db->($exitStatus);

それが終了コードです。とにかくシェルスクリプトでそれをチェックしないので、書き込まれるデータ行の数など、より便利なものに変更できます。原始的な解決策は、Perlスクリプトの先頭で(たとえば、の後に)宣言することにより、$rcounter(ローカルではなく)グローバルにすることです。次に、上記の「exitStatus」行を次のように置き換えることができます。getListTables()my $logFile;

$rcounter;         

出来上がり、Perlスクリプトは書き込まれたデータ行の数を返すようになりました。

Perlでは、戻りコード0は失敗と見なされ、その他の値は成功と見なされます。シェルでは、それは逆ですが、幸いなことに、Perlはそれを知っており、呼び出し元のシェルに戻るときにスクリプトの戻りコードを「反転」(否定)するので、心配する必要はありません。

したがって、必要なのは、郵送を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 に答える