2010-07-23 116 views
16

我有一個文件,someFile,像這樣:如何最好地將參數傳遞給Perl單線程?

$cat someFile 
hdisk1 active 
hdisk2 active 

我用這個shell腳本進行檢查:

$cat a.sh 
#!/usr/bin/ksh 
for d in 1 2 
do 
    grep -q "hdisk$d" someFile && echo "$d : ok" 
done 

我試圖將其轉換成Perl:

$cat b.sh 
#!/usr/bin/ksh 
export d 
for d in 1 2 
do 
    cat someFile | perl -lane 'BEGIN{$d=$ENV{'d'};} print "$d: OK" if /hdisk$d\s+/' 
done 

我將變量d導出到shell腳本中,並使用Perl中的%ENV獲取值。有沒有更好的方法將這個值傳遞給Perl單線程?

+4

爲什麼不執行直接在Perl循環?然後你的shell腳本就消失了。 – FMc 2010-07-23 20:13:33

+0

而不是使用'cat file | perl ...'使用'perl ... file'更簡單。 – TrueY 2013-04-23 22:30:07

回答

24

你能使用的「S」開關基本的命令行參數。一個變量被定義爲以短劃線開始的每個參數。 --告訴你的命令行參數在哪裏啓動。

for d in 1 2 ; do 
    cat someFile | perl -slane ' print "$someParameter: OK" if /hdisk$someParameter\s+/' -- -someParameter=$d; 
done 

參見:perlrun

+0

非常感謝。從來沒有真正知道它。當需要命令行參數時總是寫一個腳本。 – saudic 2013-03-11 08:11:15

1

通行證它在命令行上,這將在@ARGV可用:

for d in 1 2 
do 
    perl -lne 'BEGIN {$d=shift} print "$d: OK" if /hdisk$d\s+/' $d someFile 
done 

。注意,操作者shift在此上下文中刪除的@ARGV第一元件,這是在這種情況下$d

+0

值得指出的是,@ gbacon已將「cat a | perl -n'到'​​perl -n a'。如果你給一個文件名作爲perl的參數,它可用於-n循環。 – justintime 2010-07-23 21:33:12

0

這看起來不錯,但我會用:

for d in $(seq 1 2); do perl -nle 'print "hdisk$ENV{d} OK" if $_ =~ /hdisk$ENV{d}/' someFile; done 
2

如果您有麻煩寫一行代碼,也許這是一個有點困難的一條線(只是我的意見)。我同意@ FM的建議,並在Perl中完成整個事情。閱讀整個文件,然後測試它:

use strict; 
    local $/ = '' ; # Read in the whole file 
    my $file = <> ; 

    for my $d (1 .. 2) 
    { 
     print "$d: OK\n" if $file =~ /hdisk$d\s+/ 
    } 

你可以做它循環,但是會更長。當然,這取決於文件的大小。

請注意,到目前爲止,所有Perl示例都會爲每個匹配打印一條消息 - 您能確定沒有重複嗎?

0

結合一些早期的建議,並加入我自己的糖,我會做這樣說:

perl -se '/hdisk([$d])/ && print "$1: ok\n" for <>' -- -d='[value]' [file] 

[值]可以是數字(即2),範圍(即2

d='2-3' 
perl -se '/hdisk([$d])/ && print "$1: ok\n" for <>' -- -d=$d someFile 

和[文件:| 3 | 4)(或幾乎任何其他,這是一個有效的模式),或者甚至包含這些中的一個一個bash變量,例如-4),不同數目(即,2的列表]是你的文件名(即,someFile)。

0

我的解決方案有點不同。我通過谷歌搜索找到了你的問題的標題,但我試圖執行一些不同的事情。在這裏它可以幫助某人:

僅供參考,我在Solaris上使用tcsh

我有如下一行代碼:

perl -e 'use POSIX qw(strftime); print strftime("%Y-%m-%d", localtime(time()-3600*24*2));' 

其輸出值:

2013-05-06 

我試圖將它放在shell腳本這個,所以我可以創建日期的文件在文件名中是過去X天數。我試過了:

set dateVariable=`perl -e 'use POSIX qw(strftime); print strftime("%Y-%m-%d", localtime(time()-3600*24*$numberOfDaysPrior));'` 

但是由於變量替換,這不起作用。我不得不亂用這些引用,以便正確解釋它。我試圖用雙引號括住整個文件,但這使Perl命令在語法上不正確,因爲它與日期格式的雙引號混淆。我完成了:

set dateVariable=`perl -e "use POSIX qw(strftime); print strftime('%Y-%m-%d', localtime(time()-3600*24*$numberOfDaysPrior));"` 

這對我很好,而不必訴諸任何幻想變量出口。

我意識到這並不完全回答您的具體問題,但它回答了標題並可能幫助別人!

3

有時打破了Perl的外殼是一個很好的把戲這些俏皮話:

for d in 1 2 ; do cat kk2 | perl -lne ' print "'"${d}"': OK" if /hdisk'"${d}"'\s+/';done