Bash
Bash“while”循環終止時需要條件函式的退出程式碼
我正在嘗試獲取在 Bash
while
循環的“條件”部分中重複呼叫的函式的退出程式碼:while <function>; do <stuff> done
當此循環因錯誤而終止時,我需要
<function>
. 關於我如何得到它的任何想法?
您可以從條件中擷取退出值並向前傳播:
while rmdir FOO; ss=$?; [[ $ss -eq 0 ]] do echo in loop done echo "out of loop with ?=$? but ss=$ss"
輸出
rmdir: failed to remove 'FOO': No such file or directory out of loop with ?=0 but ss=1
在這種情況下,退出狀態
rmdir FOO
已在變數中擷取,ss
並且是1
。(嘗試用 替換rmdir FOO
。( exit 4 )
你會發現ss=4
。)這是如何運作的?請記住,語法實際上是
while list-1; do list-2; done
,而不是更常見的預期while command; do list; done
。可以是一系列以分號分隔的list-1
命令,並且文件指出“只要列表中的最後一個命令返回退出狀態為零,該while
命令就會連續執行列表list-2``list-1
。 ”作為看起來凌亂的
while
條件的替代表示,可以在表達式中分配一個變數(( ... ))
,然後使用結果。這給出了更難閱讀但更緊湊的分配和測試結構:while rmdir FOO; ((! (ss=$?))) do echo in loop done echo "out of loop with ?=$? but ss=$ss"
或者,您可以使用
while rmdir FOO; ! (( ss=$? ))
. 這些工作是因為 ((1)) 在算術上評估為 1,這通常與 true 相關聯,因此該評估的退出程式碼為 0(成功)。另一方面,((0)) 算術計算結果為 0,這通常與 false 相關聯,因此該評估的退出程式碼為 1(失敗)。這可能看起來令人困惑,因為畢竟兩個評估((.))
都是“成功的”,但這是一種技巧,可以使表示真/假的算術表達式的值與 bash 的成功/失敗退出程式碼保持一致,並製作條件表達式,如if ...; then ...; fi
,while ...; do ...; done
等,無論是基於退出程式碼還是算術值,都可以正常工作。