while循环中的一个常见问题

在楼主刚刚学习接触while循环的时候,发现了一个问题,在while循环内部对变量赋值、定义变量、数组定义等等环境,在循环外面失效。

一个简单的测试脚本如下:

while循环中的一个常见问题 

执行结果证明,$new_var的结果是空值。在google上查了查,才发现问题出在管道上。

先看看下面的内容。

while循环的写法有好几种,它的语法结构为:

while test_cmd_list; do cmd_list; done

但更经常地,while循环更多地用于读取标准输入的内容来实现循环。有以下几种写法:

写法一:使用管道传递内容,这是用的最多、但却最烂的写法

echo “abc xyz” | while read line   

do 

    …

done

写法二:

while read line

do

    …

done <<< “abc xyz”

写法三:从文件中读取内容

while read line

do

    …

done </path/filename

方法四:采用进程替换

while read var

do

    …

done < <(cmd_list)           

方法五:改变标准输入

exec <filename

while read var

do

    …

done        

尽管写法有多种,但它们并不等价。方法一中使用的是管道符号,这使得while语句在子shell中执行,这意味着while语句内部设置的变量、数组、函数等在循环外部都不再生效。这正是文章开头所说的陷阱。更简单的:echo haha | a=5,在命令执行结束后,变量a的值也不再是5。其余4种写法,while语句都不在子shell中执行,因此都不会出现文章开头所说的问题。

例如,使用写法二的here string代替写法一:

while循环中的一个常见问题 

或者使用写法四的进程替换:

while循环中的一个常见问题 

由此可以说,在上面的5种写法中,使用的最广泛的写法一虽然最简单、方便,但个人觉得有点不好。

原创文章,作者:XnlZ,如若转载,请注明出处:http://www.178linux.com/85447

(3)
上一篇 2017-08-26 19:23
下一篇 2017-08-26 19:39

相关推荐

  • linux中的管道符

    管道符 less只能看文件 但是这样做会产生一个垃圾文件ls.txt,所以下面我们就会需要用到管道符 |只将传递正确结果传递给 而使用这两种方法可以传递正确和错误的结果[root@localhost ~]# ls /etc/passwd /cpp/passwd 2>&1|less   ,  (2>&1…

    2017-07-22
  • 马哥教育网络班22期+第7周课程练习

    1、创建一个10G分区,并格式为ext4文件系统; [root@localhost ~]# fdisk /dev/sda 命令(输入 m 获取帮助):n All primary partitions are in use 添加逻辑分区 5 起始&nb…

    Linux干货 2016-10-09
  • python面向对象第二周魔术方法详解

    魔法方法及其使用__开头和结束的方法,定义外部没有办法直接调用,但会有影响使用运算符号的魔法方法, + ,-,*,/,%,//,**, __add__,__sub__,__mul__,__truediv__,__mod__,__floordiv__,__pow__,__divmod__(?),系统内部对于数值型,字符串型,容器内型都定义了其中部分或者全部的运…

    Linux干货 2017-11-22
  • LInux系统上的文件管理类型以及bash的基础特性

    LInux系统上的文件管理类型以及bash的基础特性

    2017-12-12
  • linux用户权限管理

    用户: 管理员–root= 0 普通用户–(1-65535) 系统用户–(1-499),(1-999) 登录用户–(500+),(1000+) 用户和组的配置文件位置: /etc/passwd– 存储系统用户所有信息 /etc/group– 存储用户组的所有信息 /etc/shadow&…

    2017-04-02
  • LVM2

    LVM2:         LVM: Logical Volume Manger, Version:2        dm: device mapper, 将一个或多个底层块设备组织 成一个逻辑设备的模块;           &…

    Linux干货 2016-12-30