BashでProject Euler(4) 関数

関数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っぽいのに、挙動は違うのです。では、どうすればよいでしょうか。