2012-02-16 86 views
0

我不知道是否有人可以解释为什么while循环将多个测试条件视为不同的if循环。我有2次测试,我验证出来的真和假:Bash while循环表现不同,处理多个测试条件

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

当我与运算这两个测试到if语句我有虚假的总预期:

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$ 

我在这里错过了什么?我只想写一些东西,等到两个条件都满足时,跳出循环

的前

回答

1

A 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/)" 
+0

直到循环工作,当我删除否定。这是我正在寻找但忽略的方向。谢谢。我想等到xml文件和unsentData.tmp都存在,所以没有否定的否定ANDed测试条件中的任何一个都起作用 – amadain 2012-02-17 08:14:59

3

你的假设是拨错,我认为。虽然确实执行dodone之间的代码,但(只要)条件成立。您的条件综合评估为false,如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/)" 
+0

这句法似乎并不正确。我得到了错误:-bash:语法错误附近的意外令牌'('。但我看到你的观点 – amadain 2012-02-16 13:42:52

+0

@amadain:固定语法 – Mithrandir 2012-02-16 14:02:15

+0

它仍然没有工作,所有的否定使得它非常混乱Gordons建议使用until循环谢谢 – amadain 2012-02-17 08:11:28

1
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没跑的。