如何将Bash循环变量传递给Perl解释器?

11

我正在尝试使用Bash和Perl的组合来修改一些脚本。问题是Perl认为$index是它自己的变量,但该变量从未定义:

for index in {1..25}; do
    perl -pi -e 's/\d+/$index/' cmd_$index.sh;
done
有没有办法让$index在Perl one-liner中穿上它的Bash外衣?

$index_ 在 Perl 和 bash 中都是有效的符号名称。也许您想为 s/// 运算符使用不同的分隔符? - mob
@mob:是的,我正打算更改那个...尝试使它更易读,在此过程中把事情弄糟了 :| - Zaid
@mob:正则表达式定界符已更改。 - Zaid
5个回答

19

do循环中添加一个export index;。在Perl程序体中引用$ENV{index}

或者:使用双引号"… $index … "将shell变量插值到组成Perl程序体的表达式中。如果您想扩展此一行程序,请注意正确转义Perl表达式,例如对于变量名称上的$和反斜杠,以便由Perl而不是shell解释。


只要从bash中导出了“index”,那就是最好的。您可以在循环之前或循环期间执行此操作。 - Donal Fellows

7

使用"代替'。这样,bash就可以在perl看到变量之前替换它。


3

使用双引号而不是单引号,$index将在将-e字符串传递给Perl之前插入插值。


2
这是一个可行的示例(虽然不是针对您的问题 - 抱歉!):
generatep() {
    perl -e '
        $_stem=$ARGV[0];
        $_ctx=$ARGV[1];
        $_role=$ARGV[2];
        $i=$ARGV[3];
        $ct=$i + $ARGV[4];
        while ($i < $ct) {
            print "user=$_stem$i,$_ctx,$_role\n";
            $i++;
        }
    ' ${stem} ${ctx} ${role} ${startix} ${count}
}

这难道不可能干扰Perl的-pi处理吗? - Donal Fellows
这对我很有效!你也不需要导出变量。它可以使用在脚本内部声明的变量。 - wmorrison365
将变量传递给Perl的这种方式不会影响“-pi”。 运行良好。 我在此示例中使用循环可能会影响“-pi”,但这只是一个示例。 - wmorrison365
我的评论是一个(太?)微妙的暗示,表明你没有正确地回答这个问题... - Donal Fellows

1

我猜问题在于 Bash shell 的通配符不支持范围,出于某种原因,我曾经认为它们支持。无论如何,Perl 完全支持范围:

perl -pi -e '
    BEGIN { @ARGV = map "cmd_$_.sh", 1 .. 25; } 
    my ($index) = $ARGV =~ /(\d+)/;
    s/\d+/$index/'

有点笨拙,但毕竟都是同一种语言。


你知道 BEGIN 块可以嵌在爱斯基摩亲吻中间吗 :) ? : $ perl -e '... } BEGIN { ...' - Zaid
@Zaid或许是这样,但为了节省一个花括号的打字工夫而牺牲大量的逻辑不太划算。=P - TLP

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接