代码之家  ›  专栏  ›  技术社区  ›  John Wooten

我在bash脚本中使用perl,它通过管道传输到正则表达式。如何在管道流中设置变量?

  •  0
  • John Wooten  · 技术社区  · 6 年前

    我已经创建了一个bash脚本,它在包含不同git本地存储库的多台计算机上运行。它测试许多条件,并告诉我存储库是否有未提交的文件、未跟踪的文件,其中一个测试特别告诉我,根据提交的数量,本地位于远程系统的前面还是后面。这个脚本的问题是它没有返回或设置一个“ok”标志,如果一切都是同步的,我用它来回送“ok”消息。所以,我得到的信息是它在前面或后面,但随后得到了“确定”的信息。下面是脚本中执行前向或后向的部分,我不知道如何让它以某种方式设置ok=false。

       git fetch>/dev/null && git branch -v |
            perl -wlne'
               print "$ENV{reponame} [$1] --> $3 $2"
                  if /^..(\S+)\s+([a-f0-9]+)\s+(\[(?:ahead|behind)\s+\d+\])/
            ' |
            while IFS= read -r MOD; do
               ok=false
               printf ' %s\n' "$MOD"  # Replace with code that uses $MOD
            done
            if $ok; then
                  echo " OK --> $reponame [$br] $rev"
            fi 
    

    这是我得到的输出:

     bin [develop] --> [behind 1] 026e1ad
     OK --> bin [develop] 026e1ad
     OK --> notes [develop] 4cd077f
     OK --> indecks [develop] e6b4293
     OK --> queue [develop] 5469679
     OK --> frameworks [master] 05fedb6
     OK --> dashboard [isolate] f8b1101
     OK --> nodejs [develop] 5af2ea7
     OK --> perl-forth [master] 45cc837
     OK --> blog [master] c19edfd
    

     bin [develop] --> [behind 1] 026e1ad
     OK --> bin [develop] 026e1ad
    

    我可不想在后面1次之后就好了!另一个脚本检查左栏中是否有任何不正常的情况,并向我发送电子邮件。

    1 回复  |  直到 6 年前
        1
  •  2
  •   bk2204    6 年前

    在大多数shell实现中,管道中的所有进程都在子shell中运行。在本例中,您在管道的末尾运行while循环,因此它(以及它本身)在subshell中。是否设置 ok false 不管怎样,它对if块没有影响,因为它运行的是主shell,它不从子shell继承变量。

    处理此问题最简单的方法是在子shell中运行您感兴趣的整个命令:

      git fetch>/dev/null && git branch -v |
            perl -wlne'
               print "$ENV{reponame} [$1] --> $3 $2"
                  if /^..(\S+)\s+([a-f0-9]+)\s+(\[(?:ahead|behind)\s+\d+\])/
            ' |
            (while IFS= read -r MOD; do
               ok=false
               printf ' %s\n' "$MOD"  # Replace with code that uses $MOD
            done
            if $ok; then
                  echo " OK --> $reponame [$br] $rev"
            fi) 
    

    这两个部件都使用 变量在同一个子shell中,因此您可以修改它,它将产生效果。

    推荐文章