2017-04-12 89 views
-3

我是Perl新手,Perl:意外令牌附近的語法錯誤`|'

我打算從keytool使用keytool獲取有效日期。

示例代碼:

my @test = `cd /usr/keystores; find . -name '\*\_old\_id\.jks'`; 
print "@test"; 

my @fus_res=(); 

s/\.\///g for @test; 
print "@test"; 


foreach $res(@test) 
{ 
my $short =substr($res,0,-14); 

push(@fus_res,$short); 
} 


    foreach my $j(0 ..$#fus_res) { 
     foreach my $i(0 .. $#test) { 
      if ($i eq $j) { 
       my $finali="$test[$i]"; 
       my $finalj="$fus_res[$j]"; 
       my @test1=`cd /usr/keystores;keytool -list -v -storepass "2xxpw" -alias $finalj -keystore $finali | grep Valid `; 
       print "[email protected]"; 
      } 
     } 
    } 

但密鑰存儲指令工作,爲grep的一部分收到錯誤爲:

sh: -c: line 1: syntax error near unexpected token `|' 
sh: -c: line 1: ` |grep Valid ' 

請建議什麼錯在此示例代碼

+2

的錯誤不是在Perl,它從殼牌公司(見錯誤消息的開頭'sh')。可能你的'$ finali'變量沒有被定義,或者是空字符串。 – Robert

+0

對不起。糾正 – user092

回答

2

@test包含NEWLINE-終止的項目。這會導致| grep Valid作爲單獨的(無效)命令執行。

變化

my @test = `cd /usr/keystores; find . -name '\*\_old\_id\.jks'`; 

my @test = `cd /usr/keystores; find . -name '*_old_id.jks'`; 
chomp(@test); 

和更換兩個

print "@test"; 

print "$_\n" for @test; 

注:

  • 你有(其他)問題,如果你的文件名包含特殊字符。應該使用[String :: ShellQuote]的shell_quote將文本插入到shell命令中。
  • s/\.\///g for @test;應該是s/^\.\/// for @test;。您只想刪除前導./
  • foreach my $j(0 ..$#fus_res) { foreach my $i(0 .. $#test) { ... } }應該只是foreach my $j(0 ..$#fus_res) { my $i = $j; ... } !!!

更好的版本:

use strict; 
use warnings qw(all); 
use feature qw(say); 

use File::Find::Rule qw(); 
use String::ShellQuote qw(shell_quote); 

my @qfns = 
    Find::File::Rule 
     ->relative 
     ->name('*_old_id.jks') 
     ->file 
     ->in('/usr/keystores'); 

say for @qfns; 

for my $qfn (@qfns) { 
    my $finali = $qfn; 
    my $finalj = substr($qfn, 0, -14); 

    my $cmd = shell_quote("keytool", "-list", "-v", "-storepass", "2xxpw", "-alias", "$finalj", "-keystore", "$finali"); 

    my @output = grep { /Valid/ } `cd /usr/keystores ; $cmd`; 
    # ...Error checking... 

    print "[email protected]"; 
} 
+0

編輯的代碼示例請檢查 – user092

+0

嘗試用「\ n」但仍然得到相同的問題 – user092

+0

我試過chomp(@test)但仍然得到這個sh:-c:第1行:語法錯誤附近的意外令牌' 「 sh:-c:第1行:'| grep有效' – user092

相關問題