Bash while循环在处理多个测试条件时表现不同

时间:2012-02-16 12:36:21

标签: bash while-loop conditional-statements

我想知道是否有人可以解释为什么while循环将多重测试条件与if循环区别对待。我有2个测试,我验证出来是真是假:

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

当我将这两个测试与if语句进行AND运算时,我得到了一个假的聚合:

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 个答案:

答案 0 :(得分: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/)"

答案 1 :(得分: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根本没有运行。

答案 2 :(得分:1)

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/)"