我试图基于“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";
}
我的问题:当针对undef arg运行脚本时,如:
$0 blablabla
如果没有出现此类服务/返回0,我想返回输出 感谢
答案 0 :(得分: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;
答案 1 :(得分: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;
具体检查参数是否定义,而不是真实。
答案 2 :(得分: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';
}
答案 3 :(得分: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
命令永远不会给出错误的返回,因为它包含{{1}}进程,因此您必须对其进行过滤,但我希望您明白这一点。