2012-02-16 31 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沒跑的。