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

时间:2012-01-23 15:57:07

标签: perl bash

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

for index in {1..25}; do
    perl -pi -e 's/\d+/$index/' cmd_$index.sh;
done

有没有办法让$index在Perl单行内穿Bash斗篷?

5 个答案:

答案 0 :(得分:19)

挤压export index;循环中的do。请参阅Perl程序正文中的$ENV{index}

或者:使用双引号"… $index … "将shell变量插入到构成Perl程序主体的表达式中。如果你想扩展这个单行,请注意正确地转义Perl表达式,例如变量名上的$,也许还有反斜杠,以便由Perl解释,而不是shell。

答案 1 :(得分:7)

使用"代替'。然后bash可以在perl看到它之前替换变量。

答案 2 :(得分:3)

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

答案 3 :(得分: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}
}

答案 4 :(得分:1)

我想这里的问题是bash shell globs不支持范围。出于某种原因,我认为他们做到了。无论如何,perl支持范围就好了:

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

有点笨拙,但无论如何都是一种语言。