【问题标题】:Perl: Syntax error near unexpected token `|' [closed]Perl:意外标记“|”附近的语法错误[关闭]
【发布时间】:2017-09-08 12:39:18
【问题描述】:

我是 perl 的新手,

我正在尝试使用 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 "test_final=@test1";
            }
        }
    }

但是 keystore 命令正在运行,对于 grep 部分出现错误:

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

请指出此示例代码中的错误

【问题讨论】:

  • 错误不是来自 Perl,而是来自 shell(请参阅错误消息开头的 sh)。可能您的 $finali 变量未定义或者是空字符串。
  • 是的,抱歉。已更正

标签: perl unix sh keystore keytool


【解决方案1】:

@test 包含换行符终止的项目。这会导致 | 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 "test_final=@output";
}

【讨论】:

  • 编辑后的代码示例请检查
  • 尝试使用 "\n" 但仍然遇到同样的问题
  • 我试过 chomp(@test) 但仍然得到这个 sh: -c: line 1: syntax error near unexpected token |' sh: -c: line 1: | grep 有效 '
  • 哦,我看到你已经更新了你的问题。更新了我的答案。
  • 谢谢,但 shellQuote 和 File::Rule 功能不可用。无法在 @INC 中找到 String/ShellQuote.pm(@INC 包含:/usr/local/lib64/perl5
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-31
  • 2012-10-20
  • 2012-09-29
  • 2013-12-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多