Bash while 循环读取其它命令输出的三种方式 Published on Jan 22, 2018 in Notes with 0 comment Bash 简要介绍一下 Bash 中 while 循环读取其它命令输出的三种方式。 #管道(pipe) 管道右侧命令会在 subshell 中运行,不会改变父 shell 中的变量。 ```bash num=0 cal | while read line; do ((num++)) echo ${line} done echo "num = ${num}" ``` ```txt January 2018 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 num = 0 ``` #here文档(heredoc) 不会像管道那样在 subshell 中执行 while 循环,num 变量会被改变;需要注意的是,是否使用**`双引号`**是有区别的。 ```bash num=0 while read line; do ((num++)) echo ${line} done <<< "$(cal)" echo "num = ${num}" ``` ```txt January 2018 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 num = 7 ``` ```bash num=0 while read line; do ((num++)) echo ${line} done <<< $(cal) echo "num = ${num}" ``` ```txt January 2018 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 num = 1 ``` #进程替换(process substitution) <(cmd) 相当于先将 cmd 的输出重定向到临时文件,然后 while 再读取临时文件。不过不是所有的系统或者 shell 都支持 process substitution。 ```bash num=0 while read line; do ((num++)) echo ${line} done < <(cal) echo "num = ${num}" ``` ```txt January 2018 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 num = 8 ``` # 参考文档 - http://www.708luo.com/posts/2014/10/bash-while-read/ - http://www.zmonster.me/2015/01/03/process-substitution.html - https://www.ibm.com/developerworks/cn/aix/library/au-satzsh.html 本文由 创作,采用 知识共享署名4.0 国际许可协议进行许可。本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。