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)
XnlZXnlZ
上一篇 2017-08-26
下一篇 2017-08-26

相关推荐

  • 第十周 Apache服务

    1、Centos7系统下实现httpd-2.2的安装,并分别实现prefork、worker、event等几种工作方式 2、简述request报文请求方法和状态响应码 3、详细描述httpd虚拟主机、站点访问控制、基于用户的访问控制、持久链接等应用配置实例  

    2018-02-09
  • 进程管理

    linux维护工作中,常常需要对系统上运行的程序进行管理,那么进程管理就显得相当重要。 进程初识 什么是进程?   进程是并发执行的程序在执行过程中分配和管理资源的基本单位,是一个动态概念。它代表CPU所能处理的单个任务。 什么是线程?   线程是程序流执行的最小单元,可以理解为进程中执行的一段程序片段。 进程与线程联…

    Linux干货 2016-09-07
  • TCP详解

    TCP协议详解   TCP/IP协议不是TCP和IP这两个协议的合称,而是指因特网整个使用TCP/IP协议的协议集合。他取代了OSI七层模型,成为事实上的应用于实际的模型。 TCP/IP协议与OSI协议的关系如下:   各层的作用如下: TCP特性: 工作在传输层面向连接协议 全双工协议 半关闭 错误检查 将数据打包成段,排序 确认机制 …

    2017-09-02
  • Liunx课前准备

            经过与家人的沟通终于来到了北京,开始了期待已久的Linux学习之路。    今天是讲课前第一天,和上学时代一样,各位同学做了自我介绍,仿佛又置身于10年前的课堂,同学们有序的介绍着自己,今天我们坐到了一起就为了同一个梦想。之前还有很大的顾虑:学不会怎么办?出来找不到工作怎么办?……但听了大家的介绍后发现很多同学与我一样,所有的顾虑瞬间消失,希…

    2018-03-26
  • bash脚本之函数及循环特殊用法

    一,概述 while的循环特殊用法(遍历文件的每一行)     while read line;do         循环体        &nbsp…

    Linux干货 2016-08-29