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"
}
时间: 2024-10-14 17:53:47

Linux系统中while管道的的相关文章

老男孩教育每日一题-2017年5月11-基础知识点: linux系统中监听端口概念是什么?

1.题目 老男孩教育每日一题-2017年5月11-基础知识点:linux系统中监听端口概念是什么? 2.参考答案 监听端口的概念涉及到网络概念与TCP状态集转化概念,可能比较复杂不便理解,可以按照下图简单进行理解? 将整个服务器操作系统比喻作为一个别墅 服务器上的每一个网卡比作是别墅中每间房间 服务器网卡上配置的IP地址比喻作为房间中每个人 而房间里面人的耳朵就好比是监听的端口 当默认采用监听0.0.0.0地址时,表示房间中的每个人都竖起耳朵等待别墅外面的人呼唤当别墅外面的用户向房间1的人呼喊时

LINUX系统中动态链接库的创建与使用{补充}

大家都知道,在WINDOWS系统中有很多的动态链接库(以.DLL为后缀的文件,DLL即Dynamic Link Library).这种动态链接库,和静态函数库不同,它里面的函数并不是执行程序本身的一部分,而是根据执行程序需要按需装入,同时其执行代码可在多个执行程序间共享,节省了空间,提高了效率,具备很高的灵活性,得到越来越多程序员和用户的青睐.那么,在LINUX系统中有无这样的函数库呢? 答案是肯定的,LINUX的动态链接库不仅有,而且为数不少.在/lib目录下,就有许多以.so作后缀的文件,这

在Linux系统中文件(资源)和用户的管理

一个可执行二进制程序,被加载到内存,被内核调度到CPU上运行,这时候,就表现了一个进程.也可以说进程是程序的一个实例,是程序的动态表现. 在 Linux 系统中进程(process)是有属主的,也就是该进程以哪个用户的身份运行的.大家都知道,程序有输入和输出,也称这为程序IO.如果我们程序数据输入是磁盘.如,Web 服务器,接收用户的请求之后,把网页数据从磁盘中读入加工之后再把数据响应给用户.如果,发起Web 服务进程的用户没有读取该用户请求网页文件的权限.则无法响应用户的请求了.所以,文件(资

Linux系统中安装MySQL数据库操作手册

Linux系统中MySQL数据库安装手册 一.安装概述: 在Linux操作系统中安装MySQL数据库是一个我们必须要掌握的一门技术,也决定了你以后找工作的薪资待遇,所以你知道它的厉害了吧!学会安装只是第一步,你还得学好数据库的基本操作,以及搭建一个数据库的主从配置等等.这些我都会在后面的博文中说到.下面我就简单的写一些安装MySQL数据库的一些步骤,仅供参考,如有什么不妥的地方,还请见谅! 二.安装步骤: (一)基本准备工作 1.打开虚拟机,在虚拟机中下载好最新版的MySQL数据库的压缩包.在M

学习Linux系统中命令的简单方法

如果说如何快速学习.了解Linux的话,我的答案是学命令.背命令!为何呢?对于一名新手来说,去学习Linux的思想.了解Linux的架构.明白Linux中"一切皆文件"概念虽然说是没有错,是对的.但是个人认为去学习这些"高大上"的东西不是一时半会的事儿,它需要一定的时间和经验去沉淀才能掌握.那么如何最快速了解Linux并使用呢?我依然觉得学命令.背命令,掌握命令是比较笨但却是比较快的方式. 我开始学习Linux的时候,问了前辈:我入门Linux需要掌握哪些命令呢?前

LINUX系统中LV动态扩容

LINUX系统中LV扩容 服务器:192.168.26.209 扩容数据盘:原来服务器存储配置信息 df -h df –h 增加一个硬盘,扩容20G 启动服务器,系统已经识别新硬盘设备. 创建PV: [[email protected] ~]# pvcreate /dev/sdc [[email protected] ~]# pvs 先扩展VG: [[email protected] ~]# vgextend vg_centos /dev/sdc [[email protected] ~]# p

Linux系统中“动态库”和“静态库”那点事儿 /etc/ld.so.conf 动态库的后缀为*.so 静态库的后缀为 libxxx.a ldconfig 目录名

Linux系统中“动态库”和“静态库”那点事儿 /etc/ld.so.conf  动态库的后缀为*.so  静态库的后缀为 libxxx.a   ldconfig   目录名 转载自:http://blog.chinaunix.net/uid-23069658-id-3142046.html 今天我们主要来说说Linux系统下基于动态库(.so)和静态(.a)的程序那些猫腻.在这之前,我们需要了解一下源代码到可执行程序之间到底发生了什么神奇而美妙的事情. 在Linux操作系统中,普遍使用ELF格

Linux系统中DHCP服务实战

Linux系统中DHCP服务实战部署 一.实验要求 1.将系统的主机名改成s01.benet.com 2.搭建一台dhcp服务器为局域网分配IP地址,要求分配192.168.40.0/24 3.为boss保留192.168.40.188地址 二.实验环境 虚拟机VMware Workstation11.0 RED HET 6.5 三.实验步骤 1.将系统的主机名改成s01.benet.com 2.搭建dhcp服务.为局域网分配IP地址 3.测试主机分配地址效果 4.给boss分配192.168.

LINUX系统中动态链接库的创建与使用

大家都知道,在WINDOWS系统中有很多的动态链接库(以.DLL为后缀的文件,DLL即Dynamic Link Library).这种动态链接库,和静态函数库不同,它里面的函数并不是执行程序本身的一部分,而是根据执行程序需要按需装入,同时其执行代码可在多个执行程序间共享,节省了空间,提高了效率,具备很高的灵活性,得到越来越多程序员和用户的青睐.那么,在LINUX系统中有无这样的函数库呢? 答案是肯定的,LINUX的动态链接库不仅有,而且为数不少.在/lib目录下,就有许多以.so作后缀的文件,这