管道的陷阱

最近写了一个小脚本,没有想到还遇到一个问题,感觉比较隐蔽,和大家分享一下。

 

脚本内容:

 

#!/bin/bash

 

cat $1 | while read id other

do

  flag=0

 

  cat $2 | while read new_id new_other

  do

    if [ $line == $new_line ]

    then

      flag=1

      echo $flag

      break

    fi

  done

 

  echo $flag

  if [$flag -eq 0 ]

  then

    eho $line >> $3

  fi

 

done

 

先解释一下,脚本的目的是从文件1中读取一行的第一列,然后读取文件2中每一行的第一列,如果文件2中第一列包含了文件1中的第一列的内容,则什么都不做,否则就将文件1中这一行的内容写到文件3中。

运行结果却和想象的不一样,不管文件1中一行第一列是否被包含在文件2中,文件1中的每一行都被写入到了文件3中。

调试了一下,发现第一个echo处打印的是1,但是在break之后第二个echo处打印出来就是0了,想了很久也没有搞懂。

后来找了同事一起调,把代码处理成下面这样:

 

#!/bin/bash

 

cat $1 | while read id other

do

  flag=0

 

  while [ 1 ]

  do

      flag=1

      echo $flag

      break

  done

 

  echo $flag

 

done

 

这个时候发现第一个echo打印1,第二个echo也打印1了。所以就怀疑是语句cat $2 | while read new_id new_other造成的原因了。

于是,将读取文件的方式换了一下,程序变为:

 

#!/bin/bash

 

while read id other

do

  flag=0

 

  while read new_id new_other

  do

    if [ $line == $new_line ]

    then

      flag=1

      echo $flag

      break

    fi

  done < $2

 

  echo $flag

  if [$flag -eq 0 ]

  then

    eho $line >> $3

  fi

 

done < $1

 

这样,程序终于正常工作了。

 

没有想到管道还有这个功能,把外部变量的作用域屏蔽掉了。但是在网上搜索了一下,没有找到相应的解释,也可能是自己还没有把shell编程搞透彻。

不管怎样,有一点收获就记下来,分享给大家,也希望有牛人能解释一下,整理出一个规则之类的东东来,以免下次又钻到陷阱里面去了。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值