468

私は bash スクリプトを使用しており、関数を実行して戻り値を出力したいと考えています。

function fun1(){
  return 34
}
function fun2(){
  local res=$(fun1)
  echo $res
}

を実行するfun2と、「34」が出力されません。これはなぜですか?

4

10 に答える 10

90

$(...)に含まれるコマンドによって標準出力に送信されたテキストをキャプチャします。return標準出力には出力しません。$?最後のコマンドの結果コードが含まれます。

fun1 (){
  return 34
}

fun2 (){
  fun1
  local res=$?
  echo $res
}
于 2013-06-27T07:24:16.973 に答える
82

Bash の関数は、他の言語のような関数ではありません。それらは実際にはコマンドです。したがって、関数は、パスからフェッチされたバイナリまたはスクリプトであるかのように使用されます。プログラム ロジックの観点からは、実際には違いはないはずです。

シェル コマンドは、「実際の」プログラミング言語のように基本的なデータ型やユーザー定義のデータ型ではなく、パイプ (別名ストリーム) によって接続されます。コマンドの戻り値のようなものはありません。おそらく、それを宣言する実際の方法がないためです。マンページまたは--helpコマンドの出力で発生する可能性がありますが、どちらも人間が読めるだけであるため、風に書かれています。

コマンドが入力を取得する場合、入力ストリームまたは引数リストから読み取ります。どちらの場合も、テキスト文字列を解析する必要があります。

コマンドが何かを返したい場合、echoその出力ストリームにそれを返す必要があります。よく行われるもう 1 つの方法は、戻り値を専用のグローバル変数に格納することです。出力ストリームへの書き込みは、バイナリ データも使用できるため、より明確で柔軟です。たとえば、BLOBを簡単に返すことができます。

encrypt() {
    gpg -c -o- $1 # Encrypt data in filename to standard output (asks for a passphrase)
}

encrypt public.dat > private.dat # Write the function result to a file

他の人がこのスレッドに書いているように、呼び出し元はコマンド置換を使用$()して出力をキャプチャすることもできます。

gpg並行して、関数は( GnuPG )の終了コードを「返す」でしょう。終了コードは、他の言語にはないボーナスと考えてください。または、気質に応じて、シェル関数の「シュムツェフェクト」と考えてください。このステータスは、慣例により、成功した場合は 0 になり、それ以外の場合は 1 ~ 255 の範囲の整数になります。これを明確にするために: return(like exit) は 0 ~ 255 の値しかとることができず、よく主張されるように、0 以外の値は必ずしもエラーではありません。

で明示的な値を指定しない場合return、ステータスは Bash ステートメント/関数/コマンドなどの最後のコマンドから取得されます。そのため、常にステータスがあり、returnそれを提供する簡単な方法です。

于 2013-06-27T08:31:42.850 に答える
37

このステートメントは、スクリプト全体に対して行うreturnのとほぼ同じように、関数の終了コードを設定します。exit

最後のコマンドの終了コードは、常に$?変数で利用できます。

function fun1(){
  return 34
}

function fun2(){
  local res=$(fun1)
  echo $? # <-- Always echos 0 since the 'local' command passes.

  res=$(fun1)
  echo $?  #<-- Outputs 34
}
于 2013-06-27T07:25:15.680 に答える
9

関数が定義されているスクリプトで実行する場合は、次のようにします。

POINTER= # Used for function return values

my_function() {
    # Do stuff
    POINTER="my_function_return"
}

my_other_function() {
    # Do stuff
    POINTER="my_other_function_return"
}

my_function
RESULT="$POINTER"

my_other_function
RESULT="$POINTER"

必要に応じて、関数に echo ステートメントを含めることができるため、これが気に入っています。

my_function() {
    echo "-> my_function()"
    # Do stuff
    POINTER="my_function_return"
    echo "<- my_function. $POINTER"
}
于 2015-07-03T11:21:07.747 に答える
-2

Windows 上のGit Bashは、複数の戻り値に配列を使用しています

バッシュコード:

#!/bin/bash

## A 6-element array used for returning
## values from functions:
declare -a RET_ARR
RET_ARR[0]="A"
RET_ARR[1]="B"
RET_ARR[2]="C"
RET_ARR[3]="D"
RET_ARR[4]="E"
RET_ARR[5]="F"


function FN_MULTIPLE_RETURN_VALUES(){

   ## Give the positional arguments/inputs
   ## $1 and $2 some sensible names:
   local out_dex_1="$1" ## Output index
   local out_dex_2="$2" ## Output index

   ## Echo for debugging:
   echo "Running: FN_MULTIPLE_RETURN_VALUES"

   ## Here: Calculate output values:
   local op_var_1="Hello"
   local op_var_2="World"

   ## Set the return values:
   RET_ARR[ $out_dex_1 ]=$op_var_1
   RET_ARR[ $out_dex_2 ]=$op_var_2
}


echo "FN_MULTIPLE_RETURN_VALUES EXAMPLES:"
echo "-------------------------------------------"
fn="FN_MULTIPLE_RETURN_VALUES"
out_dex_a=0
out_dex_b=1
eval $fn $out_dex_a $out_dex_b  ## <-- Call function
a=${RET_ARR[0]} && echo "RET_ARR[0]: $a "
b=${RET_ARR[1]} && echo "RET_ARR[1]: $b "
echo
## ---------------------------------------------- ##
c="2"
d="3"
FN_MULTIPLE_RETURN_VALUES $c $d ## <--Call function
c_res=${RET_ARR[2]} && echo "RET_ARR[2]: $c_res "
d_res=${RET_ARR[3]} && echo "RET_ARR[3]: $d_res "
echo
## ---------------------------------------------- ##
FN_MULTIPLE_RETURN_VALUES 4 5  ## <--- Call function
e=${RET_ARR[4]} && echo "RET_ARR[4]: $e "
f=${RET_ARR[5]} && echo "RET_ARR[5]: $f "
echo
##----------------------------------------------##


read -p "Press Enter To Exit:"

期待される出力:

FN_MULTIPLE_RETURN_VALUES EXAMPLES:
-------------------------------------------
Running: FN_MULTIPLE_RETURN_VALUES
RET_ARR[0]: Hello
RET_ARR[1]: World

Running: FN_MULTIPLE_RETURN_VALUES
RET_ARR[2]: Hello
RET_ARR[3]: World

Running: FN_MULTIPLE_RETURN_VALUES
RET_ARR[4]: Hello
RET_ARR[5]: World

Press Enter To Exit:
于 2017-09-13T15:17:43.213 に答える