Scripting
如果 !<command> (…) 與 <command> ;如果$?-eq0$?−和q0$? -eq 0(…)
我正在編寫一個 shell 腳本,並決定通過shellcheck.net檢查我的工作。我能夠在我的腳本中獲得以下兩行的功能相同的行為:
findmnt /dev/sda1 >/dev/null ; if [ $? -eq 0 ]; then echo 1; else echo 0; fi
對比
if ! findmnt /dev/sda1 >/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