他の回答の問題は、複数の関数が呼び出しチェーンにある場合に上書きされる可能性があるグローバルを使用するか、関数がecho
診断情報を出力できないことを意味します(関数がこれを実行し、「結果」、つまりreturnを忘れます)値、発信者が予想するよりも多くの情報が含まれ、奇妙なバグにつながる)、またはeval
非常に重くてハックです。
これを行う適切な方法は、関数に最上位のものを置き、local
bashの動的スコープ規則でa を使用することです。例:
func1()
{
ret_val=hi
}
func2()
{
ret_val=bye
}
func3()
{
local ret_val=nothing
echo $ret_val
func1
echo $ret_val
func2
echo $ret_val
}
func3
この出力
nothing
hi
bye
動的スコープとはret_val
、呼び出し元に応じて異なるオブジェクトを指すことを意味します。これは、ほとんどのプログラミング言語で使用されている字句スコープとは異なります。これは実際にはドキュメント化された機能であり、見落としがちで、十分に説明されていません。ここにそのドキュメントがあります(強調は私のものです):
関数にローカルな変数は、ローカル組み込みで宣言できます。これらの変数は、関数とそれが呼び出すコマンドにのみ表示されます。
C / C ++ / Python / Java / C#/ javascriptの背景を持つ人にとって、これはおそらく最大のハードルです:bashの関数は関数ではなく、コマンドであり、そのように動作します:stdout
/ stderr
に出力でき、パイプインできます/ out、終了コードを返すことができます。基本的に、スクリプトでコマンドを定義することと、コマンドラインから呼び出すことができる実行可能ファイルを作成することには違いはありません。
したがって、次のようにスクリプトを書く代わりに:
top-level code
bunch of functions
more top-level code
次のように書きます:
# define your main, containing all top-level code
main()
bunch of functions
# call main
main
ここで、としてmain()
宣言ret_val
しlocal
、他のすべての関数はを介して値を返しますret_val
。
次のUnixおよびLinuxの質問も参照してください:シェル関数のローカル変数のスコープ。
状況に応じて、おそらくさらに優れた別のソリューションは、を使用するya.teckによって投稿されたものlocal -n
です。
return
あなたの場合、基本的にはexit code
からの範囲と同じ0 - 255
です。echo
@septiの提案に従って使用します。終了コードはでキャプチャできます$?
。