2

「ps」に基づいて「サービス」スクリプトをコーディングしようとしています。私のコード:

#!/usr/bin/perl
use strict;
use warnings;
die "usage:    $0 <service name>\n" unless $ARGV[0];
my $service = $ARGV[0];
open(my $ps, "ps -aux |") || die "Uknown command\n";
my @A = <$ps>;
close $ps;
foreach my $i(grep /$service/, @A){
    chomp $i;
    if($i=~ /root/){
        next
    }
    print "$i\n";
}

私の問題:次のようなundefargに対してスクリプトを実行する場合:

$0 blablabla 

そのようなサービスが表示されない場合/0を返す場合は出力を返したいありがとう

4

4 に答える 4

2

私はあなたが求めているのは次のとおりだと思います:一致する行が見つからないときに適切なメッセージを与える方法は?

代わりに、結果を配列に格納するだけです。

my @lines = grep { !/root/ && /$service/ } @A;

if (@lines) {   # if any lines are found
    for my $line (@lines) {
        ...
    }
} else {
    print "No match for '$service'!\n";
}

または、一致数に関係なく一致数を出力できます。

my $found = @lines;
print "Matched found: $found\n";

grepにrootのチェックを追加できることにも注意してください。

補足として、この部分:

die "usage:    $0 <service name>\n" unless $ARGV[0];
my $service = $ARGV[0];

おそらくもっとよく書かれています

my $service = shift;
die "usage ...." unless defined $service;

これは、trueかどうかではなく、引数が定義されているかどうかを具体的にチェックします。

于 2013-03-04T17:19:28.607 に答える
2

私があなたを正しく理解しているなら、あなたはそのようなサービスが見つからなかった場合にユーザーに知らせたいですか?その場合、次のようにスクリプトを変更できます。

my $printed;                        # Will be used as a flag.
foreach my $i(grep /$service/, @A){
    chomp $i;
    if($i=~ /root/){
        next
    }
    $printed = print "$i\n";        # Set the flag if the service was found.
}
warn "No service found\n" unless $printed;
于 2013-03-04T17:16:49.463 に答える
1

あなたはこのようなことを試すことができます:

my @processes = grep /$service/, @A;
if ( scalar @processes ) {
    foreach my $i( @processes ){
        chomp $i;
        if($i=~ /root/){
            next;
        }
        print "$i\n";
    }
}
else {
    print 'your message';
}
于 2013-03-04T17:17:57.350 に答える
0

次のように、ループ内grepでコマンドをトラバースする前に、コマンドの結果を確認できます。for

...

my @services = grep { m/$service/ } @A;

# Filter the perl process running this script and...
if ( ! @services ) { 
    print "No service found\n";
    exit 0;
}

foreach my $i( @services ){
    ...
}

grepコマンドにはプロセスが含まれているため、コマンドが誤って返されることは決してないことを考慮に入れてください。そのため、コマンドperlをフィルタリングする必要がありますが、理解していただければ幸いです。

于 2013-03-04T17:18:16.307 に答える