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基础知识(二)

    一、Linux文件管理类命令的使用方法及其相关示例演示? 1、文件管理 (1)mkdir (2)rmdir (3)cp (4)mv (5)rm (6)touch 2、文件查看 (1)ls (2)tree (3)cat&tac (4)head (5)tail (6)more&less (7)stat 二、Bash特性详解 1、命令行展开 (1)…

    Linux干货 2016-09-27
  • 对虚拟机键入Ctrl+Alt+Delete的详细说明

            日常中我们用Windows系统时经常使用Ctrl+Alt+Delete来换出任务管理的菜单,进行任务管理,linux中也有这样的键入命令,但不是管理任务,而是重启系统!!!那么我们就应该注意了,不要误操作重启服务器。       &n…

    2017-03-28
  • 常用文本处理命令练习

    1、列出当前系统上所有已经登录的的用户的用户名,注意同一用户登录多次,则只显示一次 [root@keyou ~]#  w -hs | cut -d' ' -f 1 | sort -u  gentoo …

    系统运维 2016-11-13
  • 关于网络配置管理

                                                      &nbsp…

    系统运维 2016-09-07
  • N26-肉肉-第一周作业

    1.描述计算机的组成及其功能CPU:运算器、控制器、寄存器、缓存存储器:内存,RAM(Random Access Memory)    IO:输入输出设备2.按系列罗列linux的发行版本,并描述不同发行版本之间的联系与区别。发行版有数百种之多,著名的主流发行版有3种Debian,Slackware,RedHatDebian:使…

    Linux干货 2017-01-03
  • Linux 计划任务快速理解入门

    计划任务简单来说是一个我们规定的时间去执行我们需要的脚本、命令及需要Linux做的事情。 以前写过一个脚本,由于当时没有学过计划任务,所以写起来特别痛苦,该脚本的需求是每天晚上11:00 备份/etc目录 当时特别小白,于是这么写的: VimrebootScript ‘ #!/bin/bash whiletrue;do If [ -d/app/e…

    Linux干货 2017-05-15