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

相关推荐

  • Shell编程 详解特殊变量之位置参数

    今天我们来探讨shell编程的特殊变量:位置变量。 首先我创建了一个testargs.sh的小脚本: #!/usr/bin/env bash # # Author: jacky18676887374@aliyun.com # date: 20160813-19:30:59 # Vervion:&nb…

    Linux干货 2016-08-15
  • 重定向与管道

         本次内容    1.三种I/O设备    2.把I/O从定向入文件    3.命令tr    4.使用管道链接命令    5.tee   我们都知道程序是由:指令+数据    &n…

    2017-07-23
  • CentOS6/7下不关机识别新添加的scsi硬盘

    1)需求说明 在虚拟机中,我们在服务器开机的状态下添加新的磁盘或者说从存储上映射某个LUN区域给服务器,不重启系统的情况下,往往不能够直接识别到磁盘,在遇到这种情况的时候,我们可以让系统重新扫描让服务器重新识别到磁盘。 2)处理步骤 下面看一下在系统不重启的情况,如何让系统认识新的磁盘,并能对其分区与格式化 1、在开机状态下新增磁盘 2、执行下面的命令 ec…

    Linux干货 2016-07-22
  • DHCP

    DHCP DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)通常被应用在大型的局域网络环境中,主要作用是集中的管理、分配IP地址,使网络环境中的主机动态的获得IP地址、Gateway地址、DNS服务器地址等信息,并能够提升地址的使用率。 DHCP协议采用客户端/服务器模型,主机地址的动态分配任务由网络主机驱动…

    Linux干货 2016-11-07
  • varnish的基本配置

    主程序:varnish 配置文件: ·/etc/varnish/varnish.params—配置varnish服务进程的工作特性,例如监听的地址和端口,缓存机制; ·/etc/varnish/default.vcl—配置各Child/Cache线程的缓存工作属性; VCL状态引擎: 内建变量: ·req.*:request,表示由客…

    2017-08-08
  • 自制Linux系统

    自制Linux系统 1.首选准备一台Linux虚拟机并添加一块新硬盘 2.分区并创建文件系统,创建两个必要的分区根分区和boot分区 fdisk /dev/sdb  分区 mke2fs -t ext4 /dev/sdb1    创建boot文件系统 mke2f…

    Linux干货 2016-09-16