Цикл Bash while ведет себя по-разному, имея дело с несколькими условиями теста - PullRequest
0 голосов
/ 16 февраля 2012

Интересно, мог бы кто-нибудь объяснить, почему цикл while обрабатывает несколько тестовых условий иначе, чем цикл if.У меня есть 2 теста, которые, как я подтвердил, вышли как True и False:

Bash$ test ! -n "$(find . -maxdepth 1 -name '*.xml' -print -quit)"; echo $?
0
Bash$ test ! -e "unsentData.tmp"; echo $?
1
Bash$ 

Когда я соединил эти 2 теста в оператор if, я получил совокупность False, как и ожидалось:

Bash$ if [ ! -n "$(find . -maxdepth 1 -name '*.xml' -print -quit)" ] && [ ! -e "unsentData.tmp" ]; then echo "True"; else echo "False"; fi
False
Bash$

Теперь, когда я поместил 2 теста в цикл while, я ожидал сна, пока оба условия не были выполнены, но вместо этого я сразу получил истинный результат.

Bash$ while [ ! -n "$(find . -maxdepth 1 -name '*.xml' -print -quit)" ] && [ ! -e "unsentData.tmp" ]; do sleep 1; done; echo -e "All files Exist\n$(ls /opt/pcf/mfe/unsentXmlToTSM/xmlConnection0_TSM/)"
All files Exist 
unsentData.tmp
Bash$

Чего мне здесь не хватает?Я просто хочу написать что-то, что ждет, пока 2 условия не будут выполнены, прежде чем оно выйдет из цикла

A

Ответы [ 3 ]

3 голосов
/ 16 февраля 2012

Думаю, ваше предположение неверно.Хотя выполняется код между do и done, в то время как (пока) условие выполняется.Ваши условия в совокупности оцениваются как ложные, как видно из вывода вашего оператора if.Таким образом, тело цикла while никогда не выполняется.Попробуйте:

while ! ( [ ! -n "$(find . -maxdepth 1 -name '*.xml' -print -quit)" ] && 
          [ ! -e "unsentData.tmp" ] )  
do 
    sleep 1
done 
echo -e "All files Exist\n$(ls /opt/pcf/mfe/unsentXmlToTSM/xmlConnection0_TSM/)"
1 голос
/ 16 февраля 2012
Цикл

A while выполняется до тех пор, пока (" while ") его условие истинно;Похоже, вы хотите запустить цикл , пока его условие не станет истинным.В bash есть цикл until, который делает именно это:

until [ ! -n "$(find . -maxdepth 1 -name '*.xml' -print -quit)" ] && [ ! -e "unsentData.tmp" ]; do
    sleep 1
done
echo -e "All files Exist\n$(ls /opt/pcf/mfe/unsentXmlToTSM/xmlConnection0_TSM/)"

Или вы можете просто отменить условие (т. е. использовать «пока остаются файлы, делайте ...», а не «до тех пор, пока все файлы не будутготово, делай ... ").В этом случае это просто означает устранение отрицаний отдельных условий и переключение и на или :

while [ -n "$(find . -maxdepth 1 -name '*.xml' -print -quit)" ] || [ -e "unsentData.tmp" ]; do
    sleep 1
done
echo -e "All files Exist\n$(ls /opt/pcf/mfe/unsentXmlToTSM/xmlConnection0_TSM/)"
1 голос
/ 16 февраля 2012
while [ ! -n "$(find . -maxdepth 1 -name '*.xml' -print -quit)" ] && [ ! -e "unsentData.tmp" ]
    do sleep 1
done

==>

while false
    do sleep 1
done

, поэтому do sleep 1 вообще не работал.

...