使用 perl 循环中的变量在 perl 循环中运行 shell 命令

Posted

技术标签:

【中文标题】使用 perl 循环中的变量在 perl 循环中运行 shell 命令【英文标题】:Running a shell command in a perl loop, using a variable from the perl loop 【发布时间】:2016-06-03 20:21:43 【问题描述】:

我需要在 perl 脚本中运行一个 shell 命令(它必须是一个 shell 命令),但我需要在 perl 循环中使用一个变量

例如。做类似的事情

#!/usr/bin/perl
for my $i (0..9) 
     `echo $i`;

应该产生输出

0
1
2
3
4
5
6
7
8
9

【问题讨论】:

“我从网站收到了一些命令” 网站一般不会向人们发出命令;你必须更具体。你是说你有一个需要执行 shell 命令的 web 服务器? 该命令从其网站上提取信息,重要的是没有等效的 perl 命令,我通过电子邮件从在线数据库收到。 @C.Monster:您的问题即将结束(在撰写本文时,3 票可以结束,因为它“不清楚你在问什么”)。为防止这种情况发生,请直接向您的问题添加信息,并考虑提供MCVE (Minimal, Complete, and Verifiable Example);请参阅***.com/help/how-to-ask,了解如何提出好问题的技巧。 @C.Monster 具体来说,我建议解决 Borodin 的评论,并可能提供要运行的命令的示例。 为什么你会期待0123456789,所有内容都在一行,而不是0 在一行,1 在下一行,等等?取消换行符是否是解决问题规范的一部分? 【参考方案1】:

您可以通过多种方式进行操作,具体取决于具体需要什么。通常,这涉及使用system、反引号(使用运算符形式qx)或open。它还有许多很棒的模块。

qx 将其STDOUT 返回给程序。如果需要,请将其分配给变量。

for my $i (0..9) 
    my $cmd = "external-command $i";
    my $cmdout = qx($cmd);             # needs error checking ($?)
    print $cmdout;                     # process as needed

当每一行成为一个数组元素时,输出也可以分配给一个数组。根据您的命令是什么,您可能需要密切注意如何正确引用它,String::ShellQuote 可以提供很大帮助。如果你想获取命令的STDERR 以及使用

my $cmd = "external-command $i 2>&1";

参见qx in perlop(或readpipe),其中还讨论了错误检查;另见$?in pervar。

如果您不需要脚本中的命令输出,或者特别希望它与脚本的其他输出一起结束,请使用system。它运行的命令继承了脚本的STDOUTSTDERR,因此它们打印到标准流的内容将转到脚本输出的位置(除非它被命令调用重定向)。

for my $i (0..9) 
    my $cmd = "external-command $i";
    my $ret = system($cmd);
    if ($ret != 0) 
        warn "Error running $cmd: $ret";
        # interrogate further, see documentation for 'system'
    

上面的错误处理是基本的,更多信息请参见文档。最后,运行进程的open 有多种形式。例如,请参阅it in perlfaq8,以及对您所要求内容的完整评论。

还有一些模块,使这种工作变得更容易和更好。从简单到功能更强大,一些知名的有IPC::System::Simple、Capture::Tiny、IPC::Run3 和IPC::Run。例如,另请参阅this post 中组装的链接(示例)。

命令是否可以通过 shell 执行(但通过execvp)取决于它的调用方式,如文档中所述。短语“shell 命令”严格来说是指 shell 本身提供的一种功能,在这种情况下,您当然希望以这种方式运行它。但是,它也经常用于我们通常通过在终端中键入来执行的程序,因此它由 shell 执行。在这种情况下,您可能(也可能不)想要绕过 shell。

还要注意上面的所有块(完成前不要返回控制),所以脚本只有在完成后才会继续。这似乎是你想要的。

【讨论】:

@C.Monster 我很高兴我发布的内容满足了您的需求,感谢您的贡献。不过,我建议您现在编辑并澄清您的问题。请理解,人们稍后会搜索并访问这些帖子,并让它们保持良好的状态可以在以后帮助很多人。这样做时,我们需要注意不要以使答案无效的方式更改问题。【参考方案2】:

如果你只是想通过shell输出,只需这样做

print STDOUT `echo $i`;

【讨论】:

以上是关于使用 perl 循环中的变量在 perl 循环中运行 shell 命令的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Perl 文件 glob() 不能在标量上下文中的循环之外工作?

如何循环遍历 Perl 目录中的文件? [复制]

perl基础---循环控制

使用 Perl Excel 循环遍历单列而不是每一列

perl 第13弹 循环

无法在 Perl 循环中访问哈希查找表