関数fは次のように定義します。
[function] f() { ... }
関数の値の返し方には2種類あります。
is_even() { n=$1 return $((n%2)) }
引数は、$1、$2に格納されます。そして、returnで返します。
返せる値は0〜255の整数に限られているので、上のように、叙述関数くらいしか使い道が分かりません。次は、偶数のみ標準出力します。
#!/bin/bash is_even() { n=$1 return $((n%2)) } for n in `seq 1 10`; do if is_even $n; then echo $n fi done
もう一つは、標準出力する方法です。
#!/bin/bash fibs() { upper=$1 m=1 n=1 while [ $n -le $upper ]; do echo $n tmp=$n n=$((n+m)) m=$tmp done } N=$1 s=0 for n in `fibs $N`; do if [ $((n%2)) -eq 0 ]; then let s+=n fi done echo $s
echoで標準出力します。これは何度出力してもOKです。これを``で囲むと値となって、for 〜 in で適当に区切られて次々にnに代入されます。
ただ、このスクリプトはあまり好ましくないです。fibsは上限を決めてしまっています。本当はfibsでは上限など決めずにフィボナッチ数列を垂れ流し、外で打ち切るほうがfibsの汎用性が高くなります。ただ、上のようにforコマンドで受けていてはこうはできません。なぜなら、この構文だと、fibsが終わるまでforが回り始めません。なので、外で打ち切ろうとしてもできないのです。見かけではPythonのgeneratorっぽいのに、挙動は違うのです。では、どうすればよいでしょうか。