#!/usr/bin/perl
some code........
..................
system ("rpm -q iptables > /tmp/checkIptables");
my $iptables = open FH, "/tmp/checkIptables";
上面的代码检查Linux机器中是否安装了iptables
?如果已安装,命令rpm -q iptables
将提供如下所示的输出:
iptables-1.4.7-3.el6.x86_64
现在我已将此输出重定向到名为checkIptables
的文件。
现在我想检查变量$iptables
是否与上面给出的输出匹配。我不关心版本号。
应该是
if ($iptables eq iptables*){
...............
.......................}
但是iptables *会出错。
答案 0 :(得分:3)
您可以使用正则表达式检查字符串:
$iptables =~ /^iptables/
此外,您不需要tmp文件,您可以改为打开管道:
use strict;
use warnings;
use autodie;
open my $fh, '-|', "rpm -q iptables";
my $line = <$fh>;
if ($line =~ /^iptables/) {
print "iptables is installed";
}
这将读取输出的第一行,并根据正则表达式进行检查。
或者你可以使用反引号:
my $lines = `rpm -q iptables`;
if ($lines =~ /^iptables/) {
print "iptables is installed";
}
请注意,反引号可能会返回多行数据,因此您可能需要对其进行补偿。
答案 1 :(得分:1)
我认为你要找的是正则表达式或“模式匹配”。你希望字符串匹配一个模式,而不是特定的东西。
if ( $iptables =~ /^iptables\b/ ) {
...
}
=~
是绑定运算符,它告诉所提供的正则表达式,其源是该变量。正则表达式简单地说是查看序列“iptables”的字符串的开头,然后是“word-break”。因为' - '是一个“非单词”字符(不是字母数字或'_'),所以它会破坏这个单词。您也可以使用' - ':
/^iptables-/
但你可以用这句话完成整个事情:
use strict;
use warnings;
use List::MoreUtils qw<any>;
...
if ( any { m/^iptables-/ } `rpm -q iptables` ) {
...
}
通过反引号直接将输出汇总到列表中,并通过any
搜索该列表(参见List::MoreUtils::any
答案 2 :(得分:0)
为什么不看一下“rpm -q”的返回值,无论是否分别安装,它都将返回0或1?