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 19:23
下一篇 2017-08-26 19:39

相关推荐

  • Linux 进程及作业管理

    一 进程、线程、程序概念 1、进程(Process) 什么是进程,简单的说,进程是程序的执行实例,即运行中的程序,同时也是程序的一个副本;程序是放置于磁盘的,而运行中的程序是位于内存中的。 2、线程(Thread) 一个进程至少包括一个线程,通常将该线程称为主线程,所以线程是比进程更小的单位,是系统分配处理器时间资源的基本单元。一个进程要想同时在多颗CPU上…

    Linux干货 2016-03-15
  • week5

    1、显示当前系统上root、fedora或user1用户的默认shell; useradd fedora useradd user1 egrep "^(root|fedora|user1)" /etc/passwd | cut -d: -f1,7 2、找出/e…

    Linux干货 2016-11-24
  • Nginx 编译安装

    Nginx (“engine x”) 是一个高性能的 HTTP 和 反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服 1、Apache服务器和nginx的优缺点: Apache具有很优秀的性能,而且通过模块可以提供各种丰富的功能。 1)首先Apache对客户端的响应是支持并发的 ,运行httpd这个daemon进程之后,它会同时产生多个子进程/…

    Linux干货 2017-02-06
  • sudo——让普通用户更灵活

    sudo命令 1、sudo能够授权指定用户在指定主机上运行某些命令。如果未授权用户尝试使用sudo ,会提示联系管理员 2、sudo可以提供日志,记录每个用户使用sudo 操作 3、sudo为系统管理员提供配置文件,允许系统管理员集中地管理用户的使用权限和使用的主机 4、sudo 使用时间戳文件来完成类似“检票”的 系统,默认存活期为5 分钟的 “入场券” …

    Linux干货 2016-09-25
  • 系统基础之shell脚本编程详解2

    shell脚本编程2:   在上节我们介绍了shell脚本编程,但只是介绍了基础的内容,下面将为大家介绍shell的脚本的高级用法,判断与循环.判断分为两种:if语句和case语句;循环分为三种:for语句,while语句,until语句,select语句 判断语句:  在脚本的编写中,我们要使用大量的数据和命令,但对于使用的数据,我们要…

    Linux干货 2016-08-19
  • vim文本编辑器

    vim简介: vi: Visual Interface,文本编辑器 文本:ASCII, Unicode 文本编辑种类: 行编辑器: sed 全屏编辑器:nano, vi vim – Vi Improved 其他编辑器: gedit一个简单的图形编辑器 gvim一个Vim 编辑器的图形版本   vim使用: 三种主要模式: 命令(Norm…

    Linux干货 2017-06-17