前一阵用shell写了一个从数据库中抽取数据生成.xml文件的脚本,要求是每个文件中只生成1000条数据。于是用到了while read line 作为循环。

在制作文件计数器的时候发现了一个问题,在执行的过程中文件计数器(FILENUM)总是出现返回初始值的现象,具体简化的脚本如下:

#/bin/bash
FILENUM=1
for i in (多个表)
do
  #sql 语句 > .swap
  COUNTER=0
  cat .swap | while read line
  do
    #变量赋值以及写入文件的内容(不是重点,没细写)
    COUNTER=$[COUNTER+1]
    if [ $COUNTER -eq 1000 ]
    then
      #封包操作,封包的包名中附带了$FILENAME(没细写)
      FILENUM=$[FILENUM+1]
    fi
  done
  #封包操作,封包的包名中附带了$FILENAME,因为不能保证是1000条整数,所以read line跳出后还是需要执行这个操作。
  FILENUM=$[FILENUM+1]
done

基本流程如上:

在执行过程中发现文件计数器FILENUM总是有还原成默认值的情况。

经过调试发现,每一次while read line 循环的文件完成之后都会发生这种现象。

启动sh的时候同时也发现了两个同名的*.sh进程

经过查阅资料,发现在while read line 的用法中常用的有两种。

cat FILE | while read line
do done
while read line
do done < FILE

经过分别测试得出以下结论:

使用管道符 | 的方法相当于启动了一个独立的子进程,因此循环中的变量FILENUM是属于自进程中的,与循环外的FILENUM虽然同名,但是值却不同。

使用重定向 < 的方法则不会有这种现象,在脚本启动时并没有子进程出现,因此循环内部变量FILENUM与循环外的FILENUM变量在同一个bash shell中。

关于while read line 循环中变量作用域的问题的更多相关文章

  1. js循环函数中的匿名函数和闭包问题(匿名函数要用循环中变量的问题)

    js循环函数中的匿名函数和闭包问题(匿名函数要用循环中变量的问题) 一.总结 需要好好看下面代码 本质是因为匿名函数用到了循环中的变量,而普通方式访问的话,匿名函数的访问在循环之后,所以得到的i是循环 ...

  2. 注意for循环中变量的作用域-乾颐堂

    1 2 for e in collections:     pass 在for 循环里, 最后一个对象e一直存在在上下文中.就是在循环外面,接下来对e的引用仍然有效. 这里有个问题容易被忽略,如果在循 ...

  3. 注意for循环中变量的作用域

    for e in collections: pass 在for 循环里, 最后一个对象e一直存在在上下文中.就是在循环外面,接下来对e的引用仍然有效. 这里有个问题容易被忽略,如果在循环之前已经有一个 ...

  4. Go中变量作用域的小坑

    直接上一实例: package main import "fmt" func main(){ fmt.Println("for start") ; a < ...

  5. H5 Canvas | 画布中变量作用域与setInterval方法同步执行探究

    Demo - 随机绘制圆环 实现思路: 将一个圆环的绘制分成100份,setInterval()方法定义每隔时间n绘制一段新的,每份的开始路径都是上一次的结束路径,实现步进绘制. 通过Math.ran ...

  6. 控制器controller与指令中的link、controller中变量作用域的关系

    angjualrjs中的作用域与原生js中的函数嵌套原理一致,都是存在作用域的继承.若在子控制器(同样包括在指令中的link或是controllerding中定义变量,此时指令中必须未使用scope独 ...

  7. C/C++语言中变量作用域:局部变量,全局变量,文件级变量

    C/C++语言中的变量分为全局变量和局部变量. 这样的划分方式的根据是变量的可见范围或者叫做作用域. 1 局部变量 局部变量指的是定义在{}中的变量,其作用域也在这个范围内.尽管常见的局部变量都是定义 ...

  8. erlang中变量作用域

    http://erlangdisplay.iteye.com/blog/315452 _开头(包括_)在erlang可以是表明,这个变量可以存任意东西,就是我们常说的全匹配,_A一般来说就是表明这个东 ...

  9. Python3中变量作用域nonlocal的总结

    最近,在工作中踩到了一个关于Python3中nonlocal语句指定的变量作用域的坑.今天趁周六休息总结记录一下. 众所周知,Python中最常见的作用域定义如下:   但是,为了更加方便地在闭包函数 ...

随机推荐

  1. haproxy keepalived和nodejsv9的容器镜像所需文件

    配合hub.docker.com 的dablyo/haproxy-keepalived-nodejsv9:190407 使用的 [root@haproxy ~]# cat haproxy.cfgglo ...

  2. Springboot项目启动后访问不到Controller

    1.搭建一个简单的Springboot项目,最开始将启动类main函数与controller放到一个类里,可以正常启动和访问,但是将两个分开再启动时访问就会报错:This application ha ...

  3. hdoj3251

    这题告诉我们,最小割需:满流,S断不能到T端P4126,hdoj3987 #include <iostream> #include <cstdio> #include < ...

  4. expect使用

    expect时用与提供自动交互的工具.比如如果想要用ssh登陆服务器,每次都输入密码你觉得麻烦,那你就可以使用expect来做自动交互,这样的话就不用每次都输入密码了. 先看例子: #!/usr/bi ...

  5. 学习mysql,记录下常用的命令行语句

    MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用 ...

  6. bootstrap-editable实现bootstrap-table行内编辑

    bootstrap-editable行内编辑效果如下: 需要引入插件 列初始化代码,为可编辑的列添加editable属性: columns = [ { title: '文件名', field: 'Na ...

  7. mysql 自定义插件调试

    # 创建表的stack frame #0: 0x000000011d11f58a ha_spartan.so`Spartan_data::create_table(this=0x00007f9fc13 ...

  8. 给出一百分制成绩,要求输出成绩等级’A’、’B’、’C’、’D’、’E’。

    import java.util.Scanner; public class test5 { public static void main(String[] args) { // TODO Auto ...

  9. Kali Linux Vmware虚拟机(新手)安装

    准备工作: 1.安装VMware workstation 软件 2.下载好kali linux 的ios系统文件 3.打开电脑的虚拟化支持(Intel VT-x/EPT或AMD-V/RVI(V)) 虚 ...

  10. python学习------迭代器协议和生成器

    一.递归和迭代 递归:自己调用自己 举例解释:问路   A问B康明网络科技怎么走,B说我不是很清楚,我帮你问问C,C说我也不知道.我问问D,D说 就在兴隆.之后D返回结果给C,C返回结果给B,B返回结 ...