Awesome Hacks!

プログラミング初心者なので地道に勉強していきます。分からない人の立場から整理していきます。

シェルスクリプト_関数内の戻り値について

ちゃんと整理ができていなかったので整理。
 

結論だけいうと

関数内でreturnすると戻り値を返す。
関数内でexitすると即時終了する。

ただし、例外あり。

func(){
    exit 1
}

# 関数内でexitしても、関数の呼び出し方が下記だと関数内で終了しないみたい。
RET=`func`

 

ちなみに

理由はざっくり調べただけだけど、どうやら「`」でくくってしまうと、
別のシェル(サブシェル)で実行されてしまい、
exitそのものは「自分自身を終了させる」という処理のため、
別のシェル(サブシェル)として動かした関数のみが終了するため、
呼び元の親シェルは終了しないから、ではないかと思われる。
 

ではどうする?

検討したけどこれといった解決策はなさそう。
やるとしたら以下のどちらかかなあと思う。
 

  1. 関数の戻り値(というより出力結果)として、関数内で処理結果をechoさせ、関数の処理結果でERRORが判定できるようにしておき、関数の呼び元で関数の処理結果を受け取った際に判定してERRORの場合異常終了させる。
  2. 関数を使わない。

 
で、個人的にはERRORチェックのためではなく、ERROR処理のために実装を追加するのは
好ましくないのではと思うことや、関数化すべきメリットが大きくはない
(極端に可読性が悪くなるわけでもないし、関数を呼ぶ回数も1回のみ)ので、
関数を使わないで対応した。
 
うーん。。。でも正直もっといいやり方はないものだろうか。
そもそも、こんな作りって他の言語でもあるはずだし、他の人たちは
みんなどうやっているのだろうか。
でも思いの外そういったことについて検討しているサイトが見つからなかった。。。