Ešte pridám verziu s časovým obmedzením:
#!/bin/bash
h() { echo "here is your source code in loop" ; }
g() { [ $(date +%s) -gt $end ] || [ ${1} -le ${2} ] && return ; h; g ${1} $((1 + $2)) ; }
f() { [ ${1} -ge 0 ] && [ ${2} -ge 0 ] || return; end=$(($(date +%s) + $2)) ; g ${1} 0 ; }
# param 1 = pocet cyklov, param 2 = timeout v sekundach
f 1500 7
Rekurzia sa ukonci bud po prekroceni poctu cyklov alebo po prekroceni timeout-u (velmi nepresne - by oko).
Hovadina je, ze v bashi nie je nejaka built-in funkcia na ziskanie aktualneho casu.
Preto sa pri kazdom overovani musi spustit novy proces date. Ak mas 1500 iteracii
tak sa v najhorsiom pripade spusti 1500 krat date (pokial timeout nevyprsi skor).
Lepsie by bolo pouzit zsh, ktore ma modul zsh/datetime a cez ten overovat
aktualny cas bez toho, aby sa musel spawnovat novy proces.
A samozrejme, samotne pouzitie rekurzie je na povazenie, lebo to iste mozes napisat
aj cez while. Ale to by bola pre I_love_Math asi nuda.
Ohladom maximalnej hlbky rekurzie v bashi som nasiel iba tento stary post:
http://lists.gnu.org/archive/html/bug-bash/2003-12/msg00007.html