2011-08-22 105 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?

相關問題