Scripting

如果 !<command> (…) 與 <command> ;如果$?-eq0$?−和q0$? -eq 0(…)

  • September 28, 2021

我正在編寫一個 shell 腳本,並決定通過shellcheck.net檢查我的工作。我能夠在我的腳本中獲得以下兩行的功能相同的行為:

findmnt /dev/sda1 &gt;/dev/null ; if [ $? -eq 0 ]; then echo 1; else echo 0; fi

對比

if ! findmnt /dev/sda1 &gt;/dev/null; then echo 0; else echo 1; fi

但是 shellcheck拋出

SC2181:直接使案例如“if mycmd;”檢查退出程式碼,而不是間接使用 $?。

我不清楚使用哪個。我確實看到:https ://github.com/koalaman/shellcheck/issues/1167這似乎已經針對幾個可能的值進行了修改。我想確保我正在編寫一些使用最佳實踐的東西,並且可以毫無問題地執行並準確報告。

$?只有在多次呼叫其他實用程序時需要它的值時,才需要使用特殊變數。例如,您可能希望在診斷消息中輸出它,然後從函式中返回它。輸出某些內容printf將重置$?為 的退出狀態printf,因此您將無法在之後直接執行return "$?"(或return)返回原始退出狀態。請注意,即使使用[ ... ]resets測試某些東西$?。您可能會改為分配$?給其他變數並使用它。

如果這是項目其餘部分使用的樣式,您可能需要考慮$?在語句中使用。if在這種情況下,請記住引用擴展,因為從技術上講,$IFS可能包含數字,這意味著未引用的擴展$?可能會完全或部分消失。

utility

# shellcheck disable=SC2181
if [ "$?" -eq 0 ]; then
   echo ok
else
   echo fail
fi

然而,這會導致大量的輸入,並使程式碼略微混淆並且有點不必要地難以理解。請注意,utility上面的呼叫不以任何直接方式連接到if它後面的語句。

這裡還有一些額外的冗餘,因為該if語句現在正在檢查[實用程序的退出狀態以測試變數是否為零。該變數是另一個實用程序的退出狀態,我們可以if直接使用它。

if utility; then
   echo ok
else
   echo fail
fi

很明顯,呼叫是語句utility的一個組成部分。if

另請參閱ShellCheck wiki中警告背後的基本原理。SC2181

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