Bashはbool関数の変数の結果を割り当ててから確認します。

Bashはbool関数の変数の結果を割り当ててから確認します。

0 または 1 (たとえば true または false) を返し、引数を使用する関数を作成し、別の関数に変数を作成してその関数の結果を保存しようとします。最後に、変数が0または1(trueまたはfalse)であることを確認します。

以下は私が試しているものの例です。

#!/bin/bash

_has_string() {
  if [ $1 == "string" ];
    return 0
  else
    return 1
  fi
}

_my_func() {
  var=$(_has_string "string")
  if [ $var == "0" ]; then
    echo "var contains string"
  else
    echo "var does not contain string"
  fi
}

_my_func

私はいくつかのバリエーションを試しましたが、うまくいく方法を見つけることができないようです。私のすべてのバリアントは基本的に何も返しません$var。 0ではありません。空ではありません。文字通り、空です。

答え1

出力を終了コードと混同しています。

_my_func() {
  if _has_string 'string'; then

また、変数を引用する必要があります。これは_has_string次のように単純化できます。

_has_string() {
    [ "$1" = 'string' ]
}

答え2

$(...)返品出力コマンド内容:標準出力に送信される内容です。欲しい終了コード。 bashスクリプトのプロセス(またはあなたの場合は関数)が終了した後、特殊変数は$?終了コードに設定されます。

だから代わりに

var=$(_has_string 'string')
...

考える

_has_string 'string'
var=$?
...

答え3

他の人がすでに指摘しているように、単にif文の中の関数を使用してください。以下はあなたが知らないかもしれないいくつかのことです。

関数は形で考えることができる複合コマンド。 Bashのマニュアルによると、[[これは複合コマンドの作成に使用できる演算子の1つです。したがって、関数は_has_string()次のように実装できます。

$ _has_string()[[ "$1" = "string" ]]
$ if _has_string "string"; then echo "YES"; fi
YES

もちろん、これは通信事業者の事情のため決して持ち運ぶことはできません[[。しかし、我々は( )またはを使用することができます{}。たとえば、動作方法は次のとおりです/bin/dash

$ _has_string()( [ "$1" = "string" ]; )
$ if _has_string "string"; then echo "YES"; fi
YES
$ if _has_string "nope" ; then echo "YES"; fi                             
$ 

関連情報