在bash中循环多个条件时,这有什么问题

时间:2015-11-16 22:02:49

标签: linux bash shell gentoo

如下所示的多重条件,它与理想的文本文件一起工作正常,但我的代码的实际输出应该有一些额外的行。

while循环多个条件:

while read -r line && ([[ ! "${line/"[ebuild"}" = "${line}" ]] && [[ -n "${line}" ]])
do
   echo "This is the line:      $line."
done

如果我将代码修改为以下代码,它的工作正常。

while read -r line 
do
   if [ ! "${line/"[ebuild"}" = "${line}" ] && [ -n "${line}" ]; then
        echo "This is the line:      $line."
   fi
done

理想的文字文件:

[ebuild   R    ] app-arch/xz-utils-5.2.2::gentoo  USE="nls static-libs* threads" 0 KiB
[ebuild   R    ] sys-libs/zlib-1.2.8-r1::gentoo  USE="static-libs -minizip" 0 KiB
[ebuild   R    ] virtual/libintl-0-r2::gentoo  0 KiB
...

实际文本文件:

These are the packages that would be merged, in order:

Calculating dependencies  ... done!
[ebuild   R    ] app-arch/xz-utils-5.2.2::gentoo  USE="nls static-libs* threads" 0 KiB
[ebuild   R    ] sys-libs/zlib-1.2.8-r1::gentoo  USE="static-libs -minizip" 0 KiB
[ebuild   R    ] virtual/libintl-0-r2::gentoo  0 KiB

它出了什么问题?非常感谢你!

1 个答案:

答案 0 :(得分:5)

执行while循环直到条件为假;然后它停止循环并继续下面。第二个版本执行您想要的操作:循环直到文件结尾,但只有在符合特定条件的情况下才执行正文(echo命令)。

另一方面,第一个版本运行循环,直到文件末尾或它读取不符合条件的行。由于第一行不符合这些条件,它会立即退出循环,永远不会到达符合条件的行。