Linux系统中while管道的

Posted 骑着龙的羊

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux系统中while管道的相关的知识,希望对你有一定的参考价值。

因为项目从AIX系统迁移到了RedHat系统,之前写过的一段Shell脚本不能成功运行,经过分析,锁定了关键代码如下:

readFileContent(){
  currentFile=$1
  fileShowRows=0
  fileRealRows=0
  fileBusinessDate=$2
  fileCountStartTime=0
  fileCountEndTime=0
  echo $1
  echo $2
  cat $1 | while read line
  do     
      if [ "$fileRealRows" -eq "0" ]
      then
          echo "$line"
          fileShowRows=`echo $line | awk {split($0,a,"|"); print a[1]}`
          fileCountStartTime=`echo $line | awk {split($0,a,"|"); print a[2]}`
          fileCountEndTime=`echo $line | awk {split($0,a,"|"); print a[3]}`
          echo "$fileShowRows"
          echo "$fileCountStartTime"
          echo "$fileCountEndTime"
      fi
      echo fileRealRows‘"$fileRealRows"
      let fileRealRows+=1
      echo fileRealRows‘"$fileRealRows"
  done
  echo "$fileShowRows"
  echo "$fileRealRows"
  echo "$fileCountStartTime"
  echo "$fileCountEndTime"
}

该段代码是用于解析一下一段文本的

1|20170322000001|20170322235959
1|00206342|020602|37906|20170322|083934|21205967090|21205967090|01|01|10002930|

其中用到了出现差异的一段代码是以while管道的方式读取文件内容,在AIX和Linux系统中执行的结果分别如下

AIX执行结果:
20170322
1|20170322000001|20170322235959
1
20170322000001
20170322235959
fileRealRows0
fileRealRows1
fileRealRows1
fileRealRows2
1
2
20170322000001
20170322235959

Linux执行结果:
20170322 1|20170322000001|20170322235959 1 20170322000001 20170322235959 fileRealRows0 fileRealRows1 fileRealRows1 fileRealRows2 0 0 0 0

从执行结果中可以看出来,Linux在子Shell中赋值的父变量对父Shell无效,而AIX系统是有效的。修改的方法如下

readFileContent(){
  currentFile=$1
  fileShowRows=0
  fileRealRows=0
  fileBusinessDate=$2
  fileCountStartTime=0
  fileCountEndTime=0
  echo $1
  echo $2
  while read line
  do     
      if [ "$fileRealRows" -eq "0" ]
      then
          echo "$line"
          fileShowRows=`echo $line | awk {split($0,a,"|"); print a[1]}`
          fileCountStartTime=`echo $line | awk {split($0,a,"|"); print a[2]}`
          fileCountEndTime=`echo $line | awk {split($0,a,"|"); print a[3]}`
          echo "$fileShowRows"
          echo "$fileCountStartTime"
          echo "$fileCountEndTime"
      fi
      echo fileRealRows‘"$fileRealRows"
      let fileRealRows+=1
      echo fileRealRows‘"$fileRealRows"
  done<$1
  echo "$fileShowRows"
  echo "$fileRealRows"
  echo "$fileCountStartTime"
  echo "$fileCountEndTime"
}

 

以上是关于Linux系统中while管道的的主要内容,如果未能解决你的问题,请参考以下文章

[Go] 通过 17 个简短代码片段,切底弄懂 channel 基础

Android 逆向Linux 文件权限 ( Linux 权限简介 | 系统权限 | 用户权限 | 匿名用户权限 | 读 | 写 | 执行 | 更改组 | 更改用户 | 粘滞 )(代码片段

管道下while循环中定义的变量在退出while循环时引用为空的问题

Linux系统编程—管道

Linux - 从管道读取的孩子接收发送到标准输出的调试消息

15种Python片段去优化你的数据科学管道