2013-05-10 47 views
71

在Bash中模擬一個do-while循環的最佳方式是什麼?在Bash中模擬一個do-while循環

我可以在進入while循環之前檢查條件,然後繼續重新檢查循環中的條件,但這是重複的代碼。有更清潔的方法嗎?我的腳本

僞代碼:

while [ current_time <= $cutoff ]; do 
    check_if_file_present 
    #do other stuff 
done 

如果$cutoff時間後推出此不執行check_if_file_present,和一個做,而會。

+0

你在找'until'開關嗎? – 2013-05-10 19:52:41

+2

@MichaelGardner'直到'也會在執行循環體之前評估條件 – Alex 2013-05-10 20:09:53

+1

啊,我明白了,我誤解了你的困惑。 – 2013-05-10 20:34:10

回答

125

兩個簡單的解決方案:

while循環之前
  1. 執行一次你的代碼

    actions() { 
        check_if_file_present 
        # Do other stuff 
    } 
    
    actions #1st execution 
    while [ current_time <= $cutoff ]; do 
        actions # Loop execution 
    done 
    
  2. 或者:

    while : ; do 
        actions 
        [[ current_time <= $cutoff ]] || break 
    done 
    
+1

':'是內置的,相當於內置的'true'。他們都「沒有成功」。 – loxaxs 2017-12-26 03:40:59

87

將您的循環後的身體while和測試前。 while循環的實際主體應該是無操作的。

while 
    check_if_file_present 
    #do other stuff 
    ((current_time <= cutoff)) 
do 
    : 
done 

取而代之的是結腸,你可以使用continue如果發現更易讀

我改變了測試,因爲你似乎比較整數使用雙括號。在雙方括號內,比較運算符(如<=)是詞彙,比較2和10時會得到錯誤結果。這些操作員不在單個方括號內工作。

+10

這是一個直接進入我的特殊袋子的美味絕招。 – 2014-05-26 18:20:12

+0

在bash中做的很棒!工程師。 – 2016-05-30 09:18:21

+0

是否等同於單行'while {check_if_file_present; ((CURRENT_TIME <=截止)); };做:; done'?即是''while'條件內的命令有效地用分號分隔,而不是通過例如分號。 '&&',並按'{}'分組? – Ruslan 2016-10-19 19:49:51

3

取而代之的是結腸,您可以繼續使用,如果你發現更易讀

我的信譽太低而離開丹尼斯威廉姆森的信息發表評論。這種方法模仿了我正在尋找的Do-While循環的方式 - 在動作之後進行條件測試。我還發現,我可以在do語句之後放置索引增量(如果需要),而不是continue語句。

while 
    check_if_file_present 
    #do other stuff 
    ((current_time <= cutoff)) 
do 
    ((index++)); 
done 
+1

那麼,你現在有足夠的代表吧?在錯誤地刪除之前,您應該從答案中刪除評論。 – jpaugh 2017-07-05 23:07:30