シェルスクリプトの関数は特に入出力が何かというモノではなく、単なる処理の集合体と捉える。
実際には関数は関数ではなく、小さいコマンドと捉えたほうがしっくりくるし、構造もそうなっている。
関数はこのように function をつけて宣言するか
function hoge() { return 0 }
それを省略してもよい。省略されることのほうが多いようだ。
hoge() { return 0 }
関数の呼び出しは何もなく、コマンドのように書くだけである
hoge
関数へのパラメータは関数名に加えてズラズラ書くだけ。つまりコマンドと同じである。 内部では自動的にそれに番号が振られて、それを利用することができる。 特に受け取る記述は無い。
hoge() { echo $1 echo $2 echo $3 echo $4 } hoge 2 4 6 8 # => 2 4 6 8
戻りは所謂関数と同様に return で戻す。 しかしシェルスクリプトの関数の戻り値は基本的にエラーコードであり、実行の結果ではない。
ゼロを戻すと正常終了したとみなすのが慣例
hoge () { return 0 }
なので所謂プログラム言語での関数の戻り値は echo で標準出力に吐き出すようにするよう設計する。
hoge () { echo 'hogehoge' return 0 }
使う側はそれをこのようにバッククォートで関数の実行結果として変数に割り当てることで所謂「戻り値」として得る。
piyo=`hoge` echo $piyo # hogehoge
シェルスクリプトの関数は必ずなんらかの値を戻さねばならず、まったく空っぽの関数というのは作ることができない。
# こういうのダメ hoge () { }
関数内でも変数のスコープはグローバルである。 なので、外部を書き換えまくるし、内部がダダ漏れになる。
そこで local キーワードがあり、これを付加した変数は関数内スコープに収まる。 つまり常にこれ使えという話だ。
そしてこの記述で宣言的な記述と代入的な記述を同時にやると処理内容によっては文法エラーだと言われたりするので 分離して記述しておいたほうがよい
hoge() { local piyo piyo="piyopiyo" # 関数スコープ fuga="fugafuga" # グローバル }
function