Bash: 条件構文でカスタム関数 (true または false を返す) を使用するにはどうすればよいでしょうか?

Bash: 条件構文でカスタム関数 (true または false を返す) を使用するにはどうすればよいでしょうか?

if、、whileまたはuntilステートメントの条件付きコンテキストで、文字列が単語であるかバージョン番号であるかなど、引数をテストするカスタム メソッドを正しく使用するにはどうすればよいですか?

特に、(二重)中括弧は、 のようなテストの片側にあるメソッドに問題があるようです-gt

メソッドを呼び出すだけでよいですか? できる場合、そのためのコンテキスト要件は何ですか? つまり、(二重) 括弧の内側/外側、およびさまざまなステートメントでは、ifコマンド置換なしで関数を呼び出すとどのように反応しますか?whileuntil

また、コマンド置換を使用して異なるテストメソッドを呼び出さない場合でも、ブール演算子を使用してそれらを接続できますか?

接続には、括弧または二重括弧を使用する必要があるユースケースはありますか?

コマンド拡張はいつ必要になりますか? 関数を呼び出すために算術拡張が必要になる場合もありますか?

答え1

コマンドを含む他のすべてのコマンドと同様に、関数が終了ステータスを介して成功/失敗の true/false を返すようにする[には、組み込み関数を使用してreturn、true/成功の場合は 0 を引数として、false/失敗の場合はそれ以外の引数を指定するか、関数によって実行された最後のコマンドの終了とともに返すだけです。

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複合コマンド自体は、その中で実行された最後のコマンド (つまり、ここではtrueまたはfalseコマンドのいずれか) を返します。

そして、if/whileステートメントでは、コマンドではなく、これらの関数を呼び出します[

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

二重中括弧または二重括弧についての(私にはよく分かりませんが)言及については、 は[単なる通常のコマンド(コマンドの別名test)ですが、Korn シェルやその派生シェルには次のようなものbashがあります。

  • (( arithmetic expression ))算術式を評価し (C 言語の構文に似ており、シェルによって異なります)、結果の数値が 0 以外の場合は true/成功 (通常どおり 0 終了ステータス経由) を返す構造です。この算術式構文には、C 言語の構文に似た比較演算子とブール演算子がいくつかあります( 、、、<... ) 。>=||&&
  • 条件式を評価する構造[[ conditional expression ]](独自の構文を持ち、これもシェルごとに異なり、[引数を解析する方法を彷彿とさせます)。この構造は、[/コマンドと同様に、上記のようなさまざまなテストを実行したり、文字列や数値を比較したりするためtestに使用できます。-nt

ただし、bash には二重中括弧演算子はありません。

関連情報