linux shell do done,bash千万不要这样cmd | while read X Y Z; do ... done使用
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使用相关推荐
- linux shell脚本 wget,bash – 在shell脚本中运行wget和其他命令
以下是编写shell脚本时要使用的一些准则. >使用它们时始终引用变量.这有助于避免误解的可能性. (如果文件名包含空格怎么办?) >不要相信像rm这样的命令上的文件加载.请改用循环. ( ...
- linux shell 函数库,bash shell 函数库
bash shell 函数库ash由自由软件基金会,Inc.版权所有(C) 1989-2011. 语法 bash [options] [file] 描述 Bash是一种与sh兼容的命令语言解释器,它执 ...
- linux shell #[感叹号]/bin/bash 是什么意思?
垃圾CSDN,标题里感叹号都发不出来! 文章目录 #!/bin/bash简介 1)`#!/bin/bash`只能放在第一行,如果后面还有`#!`,那么只能看成是注释. 2)#!后面的路径一定要正确,不 ...
- linux shell 数组对比,bash shell之数组使用(牛逼篇)
这次写脚本时用到了bash shell数组,当初做法是配置文件里面写成数组形式A=(element1 element2 element3 .... element4),然后一个脚本读取这个配置文件,于 ...
- linux shell 鼠标事件,Bash Shellshock事件:CVE-2014-6271资料汇总
法国GNU/Linux爱好者Stéphane Chazelas于2014年9月中旬发现了著名SHELL实现BASH的一个漏洞,你可以通过构造环境变量的值来执行你想要执行的脚本代码,据报道称,这个漏洞能 ...
- linux shell 获取表,bash - 如何获取shell脚本中目录中的文件列表?
bash - 如何获取shell脚本中目录中的文件列表? 我试图使用shell脚本获取目录的内容. 我的脚本是: for entry in `ls $search_dir`; do echo $ent ...
- linux shell declare -a,Bash Shell之declare定义变量
实验环境 ~]# cat /etc/redhat-release CentOS Linux release 7.3.1611 (Core) 命令说明 declare 与 typeset 命令都是bas ...
- linux shell 字符串 数组,bash shell函数返回数组字符串
#!/bin/bash # script:getselfvar.sh # 每个脚本中都在末尾追加了一段特殊的域名ip序列,需要将这段序列存放到数组变量中,供 # 脚本使用,例子中的ip和域名是处理过的 ...
- linux shell if运行,bash – shell脚本执行检查是否已经在运行
检查已经执行的进程的更简单的方法是pidof命令. if pidof -x "abc.sh" >/dev/null; then echo "Process alre ...
最新文章
- shell命令获取按键值_linux shell获取键盘输入
- sm总线控制器找不到驱动程序_技术 | 基于CAN总线的伺服电机通信控制
- [转]MySQL数据库优化总结
- Drools学习 入门实例
- 基于 vue 的验证码组件
- [react] React的render中可以写{if else}这样的判断吗?
- 网友写的验证码生成方案,可防止绝大多数机械识别。
- react typescript 父组件调用子组件
- Astronauts UVALive - 3713(2-SAT)
- Docker与Dragonfly详细多机部署
- win10 u盘 修复计算机,u盘启动修复Win10引导文件丢失的方法
- EDM系统看板多邮件模板邮箱配置地址簿​EDM营销推送邮件系统开发
- 渐进式量产进阶!卡车自动驾驶进入商业化新周期
- [PDF文件怎么编辑]如何在PDF文档中插入图片
- bergerAimi
- MyCat —— 性能最好的数据库中间件
- Unity中的Delegate
- Python 自动发送QQ端口消息 —— 2022/2/10
- 亲子操打开孩子感官能力
- 60个让程序员崩溃的瞬间,我已崩溃,哈哈哈哈哈