2015-11-16 3 views
1

Множество условий, как показано ниже, отлично работает с идеальным текстовым файлом, но фактический вывод моего кода должен иметь некоторые дополнительные строки.Что не так с этим многократным условием цикла в bash

в то время как петля множественного условия:

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 

Что случилось с ним? Большое спасибо!

+0

Обратите внимание, что вы можете использовать '&&' и '||' inside '[[...]]', поэтому вы можете написать 'read -r line && [[! "$ {line /" [ebuild "}" = "$ {line}" && -n "$ {line}"]] '. – chepner

+0

Я пробовал, не работал вообще, как комментировал Гордон, независимо от того, как я изменяю логический порядок, ни один из них не будет работать. Мне нужно переместить несколько условий внутри цикла while. –

ответ

5

A while цикл выполняется до тех пор, пока условие не станет ложным; затем он останавливается и продолжается ниже. Вторая версия делает то, что вы хотите: цикл while до конца файла, но только выполняйте тело (команда echo), если линия соответствует определенным условиям.

Первая версия, с другой стороны, запускает цикл до тех пор, пока ни конец файла, ни он не прочитают строку, которая не соответствует условиям. Поскольку первая строка не соответствует этим условиям, она немедленно выходит из цикла и никогда не попадает в строки, соответствующие условиям.