2011-08-22 132 views
2
#!/usr/bin/perl 
some code........ 
.................. 
system ("rpm -q iptables > /tmp/checkIptables"); 
my $iptables = open FH, "/tmp/checkIptables"; 

上述代码检查iptables是否安装在您的Linux机器中?如果安装了命令rpm -q iptables会给输出,如下图所示:从文件读取并将内容与变量进行比较

iptables-1.4.7-3.el6.x86_64 

现在我已经重定向这个输出命名为checkIptables文件。

现在我想检查变量$iptables是否与上面给出的输出相匹配。我不关心版本号。

它应该是这样的

if ($iptables eq iptables*){ 
............... 
.......................} 

但是iptables的*给人错误。

+0

'open'只是返回一个表示打开操作是否成功的值 - 它不会返回正在打开的东西的内容。也就是说,'$ iptables'没有你认为它的值。 – mob

+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

我认为你要找的是一个正则表达式或“模式匹配”。你想要的字符串匹配的模式,而不是一个特定的事情。

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

0

为什么不看看“rpm -q”的返回值,它会分别返回0还是1?

相关问题