bash千万不要这样" | while read X Y X; do ... done"使用

因为在bash里面”|"后命令是在一个新的shell里面运行的,即“|”前后不在一个进程里面,所以如果在while循环里面使用了变量之类的赋值,就会无效。

举个例子:

#!/bin/bash

VAR=AAA

echo ${VAR}

echo "Hello World" | tr ' ' '\n' | while read WORD; do

VAR=BBB

echo ${VAR}

done

echo ${VAR}

运行结果:

AAA

BBB

BBB

AAA

看到在while循环内尽管已经把VAR置成了BBB,但是在循环退出后,VAR的值还是回退到AAA,也就是循环内变量赋值无效。

为什么呢,因为while循环实在一个独立的进程空间里面运行的,在那个进程内把VAR改成了BBB,但是并不影响在外面主进程的空间。

我们把PID打出来看看:

VAR=AAA

echo ${VAR}

echo PID=$$

echo "Hello World" | tr ' ' '\n' | while read WORD; do

VAR=BBB

echo ${VAR}

echo PID=$$

done

echo ${VAR}

echo PID=$$

运行:

AAA

PID=87654

BBB

PID=87654

BBB

PID=87654

AAA

PID=87654

貌似PID也一样啊,不是吗?

不是的,因为打印PID的用法错误了,"$$"在脚本启动的时候就解析完了,全部替换成了当前进程的PID所以都一样;我们改一下:

#!/bin/bash

VAR=AAA

echo ${VAR}

cut -d' ' -f4 < /proc/self/stat

echo "Hello World" | tr ' ' '\n' | while read WORD; do

VAR=BBB

echo ${VAR}

cut -d' ' -f4 < /proc/self/stat

done

echo ${VAR}

cut -d' ' -f4 < /proc/self/stat

在运行:

AAA

87896

BBB

87900

BBB

87900

AAA

87896

这里就可以看出while循环内的PID和循环外的PID是不一样的。

那应该怎么用呢:

答:

while read X, Y, X; do

...

done < )

例:

#!/bin/bash

VAR=AAA

echo ${VAR}

cut -d' ' -f4 < /proc/self/stat

while read WORD; do

VAR=BBB

echo ${VAR}

cut -d' ' -f4 < /proc/self/stat

done <

echo ${VAR}

cut -d' ' -f4 < /proc/self/stat

得到运行结果:

AAA

89047

BBB

89047

BBB

89047

BBB

89047

linux shell do done,bash千万不要这样cmd | while read X Y Z; do ... done使用相关推荐

  1. linux shell脚本 wget,bash – 在shell脚本中运行wget和其他命令

    以下是编写shell脚本时要使用的一些准则. >使用它们时始终引用变量.这有助于避免误解的可能性. (如果文件名包含空格怎么办?) >不要相信像rm这样的命令上的文件加载.请改用循环. ( ...

  2. linux shell 函数库,bash shell 函数库

    bash shell 函数库ash由自由软件基金会,Inc.版权所有(C) 1989-2011. 语法 bash [options] [file] 描述 Bash是一种与sh兼容的命令语言解释器,它执 ...

  3. linux shell #[感叹号]/bin/bash 是什么意思?

    垃圾CSDN,标题里感叹号都发不出来! 文章目录 #!/bin/bash简介 1)`#!/bin/bash`只能放在第一行,如果后面还有`#!`,那么只能看成是注释. 2)#!后面的路径一定要正确,不 ...

  4. linux shell 数组对比,bash shell之数组使用(牛逼篇)

    这次写脚本时用到了bash shell数组,当初做法是配置文件里面写成数组形式A=(element1 element2 element3 .... element4),然后一个脚本读取这个配置文件,于 ...

  5. linux shell 鼠标事件,Bash Shellshock事件:CVE-2014-6271资料汇总

    法国GNU/Linux爱好者Stéphane Chazelas于2014年9月中旬发现了著名SHELL实现BASH的一个漏洞,你可以通过构造环境变量的值来执行你想要执行的脚本代码,据报道称,这个漏洞能 ...

  6. linux shell 获取表,bash - 如何获取shell脚本中目录中的文件列表?

    bash - 如何获取shell脚本中目录中的文件列表? 我试图使用shell脚本获取目录的内容. 我的脚本是: for entry in `ls $search_dir`; do echo $ent ...

  7. linux shell declare -a,Bash Shell之declare定义变量

    实验环境 ~]# cat /etc/redhat-release CentOS Linux release 7.3.1611 (Core) 命令说明 declare 与 typeset 命令都是bas ...

  8. linux shell 字符串 数组,bash shell函数返回数组字符串

    #!/bin/bash # script:getselfvar.sh # 每个脚本中都在末尾追加了一段特殊的域名ip序列,需要将这段序列存放到数组变量中,供 # 脚本使用,例子中的ip和域名是处理过的 ...

  9. linux shell if运行,bash – shell脚本执行检查是否已经在运行

    检查已经执行的进程的更简单的方法是pidof命令. if pidof -x "abc.sh" >/dev/null; then echo "Process alre ...

最新文章

  1. shell命令获取按键值_linux shell获取键盘输入
  2. sm总线控制器找不到驱动程序_技术 | 基于CAN总线的伺服电机通信控制
  3. [转]MySQL数据库优化总结
  4. Drools学习 入门实例
  5. 基于 vue 的验证码组件
  6. [react] React的render中可以写{if else}这样的判断吗?
  7. 网友写的验证码生成方案,可防止绝大多数机械识别。
  8. react typescript 父组件调用子组件
  9. Astronauts UVALive - 3713(2-SAT)
  10. Docker与Dragonfly详细多机部署
  11. win10 u盘 修复计算机,u盘启动修复Win10引导文件丢失的方法
  12. EDM系统看板多邮件模板邮箱配置地址簿​EDM营销推送邮件系统开发
  13. 渐进式量产进阶!卡车自动驾驶进入商业化新周期
  14. [PDF文件怎么编辑]如何在PDF文档中插入图片
  15. bergerAimi
  16. MyCat —— 性能最好的数据库中间件
  17. Unity中的Delegate
  18. Python 自动发送QQ端口消息 —— 2022/2/10
  19. 亲子操打开孩子感官能力
  20. 60个让程序员崩溃的瞬间,我已崩溃,哈哈哈哈哈

热门文章

  1. 想要更好的云基础设施管理!你检查IT工具集了吗?
  2. 1163: 零起点学算法70——Yes,I can!
  3. 算法导论6:排序小结和最值取法 2016.1.6
  4. 一个worker thread服务一个客户端
  5. 关于Watir的upload file不能自动选择文件的解决方案
  6. 在linux下面实现检测按键(Linux中kbhit()函数的实现)
  7. 当使用malloc提示找不到标识符时?
  8. 转:让程序只运行一个实例的四种方法
  9. 嘿嘿,我就不信搞不定你--Dynamo
  10. Chapter 2 Open Book——5