【问题标题】:How can I pass on my Bash loop variable to the Perl interpreter?如何将我的 Bash 循环变量传递给 Perl 解释器?
【发布时间】:2012-02-16 23:18:42
【问题描述】:

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

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

有没有办法让$index 在 Perl 单层中穿上它的 Bash 斗篷?

【问题讨论】:

  • $index_ 在 Perl 和 bash 中都是有效的符号名称。也许您想为 s/// 运算符使用不同的分隔符?
  • @mob :是的,我打算改变它......试图让它更具可读性并在这个过程中捏造一些东西:|
  • @mob : 正则表达式分隔符已更改

标签: perl bash


【解决方案1】:

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

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

【讨论】:

  • 这是最好的,提供 index 已从 bash 导出。您可以在循环之前或期间执行此操作。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      这是一个可行的示例(尽管不是按照您的问题 - 抱歉!):

      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 处理吗?
      • 对我来说效果很好!您也不需要导出变量。它适用于脚本中本地声明的变量。
      • 即这种将 vars 传递给 perl 的方式不会影响“-pi”。工作正常。我在此使用循环,例如可能会影响“-pi”,但它只是一个例如
      • 我的评论是(也是?)微妙的暗示,表明您没有正确解决问题......
      【解决方案5】:

      我猜这里的问题是 bash shell glob 不支持范围。出于某种原因,我认为他们做到了。没关系,perl 支持范围就好了:

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

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

      【讨论】:

      • 你知道BEGIN 块可能会夹在爱斯基摩吻之间:) 吗? :$ perl -e '... } BEGIN { ...'
      • @Zaid 也许是这样,但这会牺牲很多逻辑来节省一个大括号的输入。 =P
      猜你喜欢
      • 2017-08-02
      • 1970-01-01
      • 2014-10-05
      • 2017-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多