Bash 関数から値を返します。

Bash 関数から値を返します。

数値が有効な10桁の場合、1を返す関数があります。

valNum()
{
    flag=1
    if [[ $1 != [1-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] ]]; then
        echo "Invalid Number"
        flag=0
    fi
    return $flag
}

次のように呼び出されます。

if [[ $(valNum $num) -eq 1 ]]; then
      #do something
fi

数値が有効な場合、関数は正しく機能しますが、無効な数値を入力すると構文エラーが表示されます。

答え1

@chorobaの答えは正確ですが、この例ではより明確になります。

valNum $num
valNumResult=$? # '$?' is the return value of the previous command
if [[ $valNumResult -eq 1 ]]
then
  : # do something
fi

この例は少し長いですが($valNumResult値の設定とクエリ)、何が起こるのかをより明確に説明します。つまり、valNum()値が返され、その値を照会してテストできます。

追記お願いします。0合計trueをゼロ以外の値で返してくださいfalse。これにより、戻り値を使用して、失敗したケースで「失敗した理由」を示すことができます。

答え2

Bashの関数は終了コードのみを返すことができます。対照的に、コマンド置換は、コマンドまたは機能の標準出力を得るために使用される。したがって、返されたフラグを確認するために以下を置き換える必要はありません。

if valNum "$num" ; then
    # ...
fi

ただし、これが正しく機能するには、数値が有効な場合は0を返し、無効な場合は1を返す必要があります。終了コード 0 はエラーがないことを意味します。

答え3

シェル関数は任意の結果を返すことはできません。 0から255の整数ステータスコードのみを返すことができます。 (より大きな値を渡すことはできますが、returnモジュールとして256に切り捨てられます。)成功するには値が0でなければならず、失敗した場合は別の値を使用する必要があります。慣例的に値が高いほど、エラーコードは1〜125に従う必要があります。特別な意味(126および127の外部コマンドエラー、より高い値の信号によって終了)。

ここでは、はいまたはいいえの結果を返すので、ステータスコードは適切です。成功か失敗かを示すようだからflag(作成した内容とは逆に)成功は0、失敗は1の正規値を使用しなければなりません。その後、if文で直接関数を使用できます。

valNum ()
{
  local flag=0
  if [[ $1 != [1-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] ]]; then
    echo 1>&2 "Invalid Number"
    flag=1
  fi
  return $flag
}
if valNum "$num"; then
  #do something
fi

エラーコードを区別する必要がある場合は、この機能を直接呼び出してください。返品直後に失敗コードを確認できます$?。その後、Case文を使用して確認できます。

valNum "$num"
case $? in …

後でステータスコードを使用する必要がある場合は、$?次のコマンドで上書きする前に別の変数に保存してください。

valNum "$num"
valNum_status=$?

コマンド置換が$(…)コードからエラーメッセージまたは空の関数の出力に拡張されるため、作成した内容は機能しません1

ステータスコードがシェル関数に許可するよりも多くの情報を渡す必要がある場合は、2つの可能性があります。

  • 標準出力にいくつかのテキストを印刷し、コマンド置換で関数を呼び出します。$(valNum "$num")
  • 関数内に1つ以上の変数を割り当て、後でその変数を読み込みます。

答え4

私自身もこの分野で矛盾する結果を得ました。これが私の経験的実験の結果です。まず、一部理論' bash または *nix コマンドに関して:

  • 成功==0...今すぐ。エラー状態コードなし)
  • FAIL != 0... 一部のステータスコード

例:

if  ls -lt /nonexistantdir
then 
    echo "found"
else
    echo "FAIL"
fi
#
echo
ls -lt /nonexistantdir; echo "status = $?"
echo "status = $?"

出力:

ls: cannot access '/nonexistantdir': No such file or directory
FAIL... 

ls: cannot access '/nonexistantdir': No such file or directory
status = 2

示されているように、lsコマンドはステータスコード= 2を返します。有効なディレクトリを試みると、ステータスは0(0)。ほとんどすべての他の言語とは異なります。

ルール#1- 作る...

  • そうです==0
  • 偽物! =0

私たちは私たちであることを覚えておくべきですテストBashステートメントのifエラーコード。定数を設定し、シェルtrueまたはfalseコマンドを使用することもできます。

TRUE=0
FALSE=1

#  valid number function
#
valNum()
{
    flag=$TRUE

    if [[ $1 != [1-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] ]]; then
        echo "Invalid Number"
        flag=$FALSE
    fi
    return $flag
}

#    later on ...
#
if validNum Abc 
then
    echo "Lucky number"
else
    echo "Not lucky."
fi

そして出力:

Invalid Number
Not lucky.

しかし、はい投票してください「@Gillesは、彼の答えが正しいからです。私は電子ペーパーの単純な側面を扱いたかった。

もう一つの点はtest注文する。これは次のとおりです。

[[ some-expression ]]; 

ほとんどの場合。たとえば、

$ test 1
$ echo "result = $?"
result = 0
$ test 0
$ echo "result = $?"
result = 0

ゼロ(0)本物。なぜ?マンページには単一の引数が '本物'NOT-NULLの場合。

引用:

関連情報