Bash

Bash“while”循環終止時需要條件函式的退出程式碼

  • November 24, 2021

我正在嘗試獲取在 Bashwhile循環的“條件”部分中重複呼叫的函式的退出程式碼:

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等,無論是基於退出程式碼還是算術值,都可以正常工作。

引用自:https://unix.stackexchange.com/questions/676733