Bash:如何在條件建構中使用自訂函數(傳回 true 或 false)?

Bash:如何在條件建構中使用自訂函數(傳回 true 或 false)?

if如何在、while或語句的條件上下文中正確使用測試參數的自訂方法,例如,字串是否是單字或版本號until

特別是(雙)大括號似乎在測試一側的方法有問題,例如-gt.

我可以只呼叫一個方法嗎?如果是,這樣做的背景要求是什麼?那麼(雙)括號內/外以及不同的語句中ifwhile以及until- 它們如何對沒有命令替換的調用函數做出反應?

如果我不使用命令替換來呼叫不同的測試方法,我仍然可以透過布林運算子連接它們嗎?

對於它們的連接,是否存在必須使用括號或雙括號的用例?

什麼時候需要命令擴充?我有時需要算術擴充來呼叫函數嗎?

答案1

您希望您的函數像所有其他命令(包括該[命令)一樣透過退出狀態返回成功/失敗 true/false,方法是使用return帶有0 作為true/success 參數的內建函數以及false/failure 的其他任何參數,或者僅返回該函數運行的最後一個命令的退出:

isnewer() {
  [ "$1" -nt "$2" ]
  # here returns with the status of the [ command
}

isvowel() {
  case $1 in
    ([aeiouAEIOU]) true;; # or return 0
    (*) false;;           # or return 1
  esac
}

該命令會傳回複合命令的退出狀態,case複合命令本身會傳回其中執行的最後一個命令(因此此處的命令truefalse命令的退出狀態)。

然後在您的if/while語句中,您呼叫這些函數,而不是[命令:

if isnewer /etc/passwd /etc/shadow; then
  echo passwd newer than shadow
fi
if isvowel "$x" || isvowel "$y"; then...

至於您(我不清楚)對雙大括號或雙括號的引用, while[只是一個普通命令(該test命令的另一個名稱),Korn shell 和一些衍生產品包括bash

  • 一個(( arithmetic expression ))構造,它計算算術表達式(遵循類似C 語言的語法,並且在shell 之間有所不同),如果結果數字不是0,則返回true/成功(像往常一樣通過0 退出狀態)。表達式語法確實有一些類似 C 語言的比較和布林運算子 ( <, >=, ||, &&...)。
  • 一個構造,它計算條件表達式(使用它自己的語法,也因 shell 的不同而不同,並且讓人想起解析其參數的[[ conditional expression ]]方式。該構造,如/命令,可用於執行許多類似上面的測試或比較字串甚至數字。[[test-nt

然而 bash 中沒有雙括號運算子。

相關內容