不是所有的grep输出行都返回

我正在编写一个shell脚本来与我们的本地Docker仓库进行交互,并发现从我的bash脚本中得到的结果不尽人意。 首先从命令行使用:

des@dev: docker images | grep gateway 

我得到:

 test-gateway 4.27.0-1.5.2-301 b215d109c627 8 days ago 1.977 GB test-gateway dev b215d109c627 8 days ago 1.977 GB test-gateway staging b215d109c627 8 days ago 1.977 GB test-gateway 4.26.2-1.5.2-298 7376dd26db6e 2 weeks ago 2.117 GB test-gateway 4.26.2-1.5.2-297 c84e6de5a18e 2 weeks ago 2.117 GB test-gateway 4.26.0-1.5.2-296 e6a772c0e230 2 weeks ago 2.048 GB test-gateway 4.24.3-1.5.2-295 d3743f5246f4 3 weeks ago 1.978 GB test-gateway prod d3743f5246f4 3 weeks ago 1.978 GB test-gateway 4.24.1-1.5.2-294 99065a070172 5 weeks ago 1.908 GB test-gateway 4.24.1-1.5.2-293 90639b86573a 5 weeks ago 1.908 GB test-gateway 4.24.1-1.5.2-292 223f8c3a41cf 5 weeks ago 1.908 GB test-gateway 4.24.0-1.5.2-291 5646792848cf 6 weeks ago 1.873 GB test-gateway 4.24.0-1.5.2-290 8a4e92f6a7b9 6 weeks ago 1.847 GB test-gateway 4.24.0-1.5.2-289 475e72c8691e 6 weeks ago 1.847 GB test-gateway 4.23.8-1.5.2-288 1c83a9f9ccc4 7 weeks ago 1.812 GB test-gateway 4.23.8-1.5.2-287 5e77c056c703 7 weeks ago 1.812 GB test-gateway 4.23.7-1.5.2-286 b9d9f95ec17d 7 weeks ago 1.812 GB test-gateway 4.23.6-1.5.2-282 f40fe68c0183 8 weeks ago 1.997 GB 

运行以下脚本:

 #!/bin/bash docker images | grep gateway | while read line; do read line echo "$line" done; 

返回:

 test-gateway staging b215d109c627 8 days ago 1.977 GB test-gateway 4.26.2-1.5.2-298 7376dd26db6e 2 weeks ago 2.117 GB test-gateway 4.26.0-1.5.2-296 e6a772c0e230 2 weeks ago 2.048 GB test-gateway prod d3743f5246f4 3 weeks ago 1.978 GB test-gateway 4.24.1-1.5.2-293 90639b86573a 5 weeks ago 1.908 GB test-gateway 4.24.0-1.5.2-291 5646792848cf 6 weeks ago 1.873 GB test-gateway 4.24.0-1.5.2-289 475e72c8691e 6 weeks ago 1.847 GB test-gateway 4.23.8-1.5.2-287 5e77c056c703 7 weeks ago 1.812 GB test-gateway 4.23.6-1.5.2-282 f40fe68c0183 8 weeks ago 1.997 GB 

为什么bash脚本不能返回所有匹配的行?

注意:只要看看输出我看到它出现的脚本是在某种程度上取消了图像的大小相同的行 – 这使得这更奇怪,因为没有什么限制脚本中的输出。

你有一个额外的read line调用,让你跳过结果的每一行,当你parsing输出,这需要被删除。

通过使用read命令和while循环引入一个简单的进程replace语法,还可以删除额外的子shell处理层。 该语法基本上允许您从命令输出中读取,就像从文件读取一样。

 while IFS= read -r line; do printf '%s\n' "$line" done< <(docker images | grep gateway)