Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: fotka 31. 08. 2014, 18:31:49
-
Dobrý den, prosím jak přeruším následující while loop pokud se hodnota $value2 nestane nižší než $value během cca 5 minut nebo cca 300 cyklech toho while? Případně jak jinak by to mělo vypadat aby se ten loop přerušil po nějakém čase nebo počtu cyklů? potřebuji aby se vykonával zbytek skriptu, který je umístěn pak podtím.. děkuji
while [ "$value" -gt "$value2" ];do
$value2=$(...get_value2_command_here...)
sleep 1
done
-
jde to třeba tak, že na novou řádku před ten while loop dám
loopnumber=1
a pak dovnitř toho while dám:
loopnumber=$((loopnumber+1))
tím se při každém loopu bude navyšovat hodnota 1 o 1, tedy 1 2 3 4
dále do toho while loopu dám pravidlo pokud je ta hodnota větší než třeba 60 (60 cyklů), tak se to ukončí (break)
if [ "$loopnumber" -gt "60" ];then
echo "Je to již 60 cyklů, tak to skončíme a pokračujeme dále ve skriptu"
break
fi
-
#!/bin/bash
h() { echo "here is your source code in loop" ; }
g() { [ ${1} -le ${2} ] && return ; h ; t=${2} ; ((t++)) ; g ${1} ${t} ; }
f() { [ ${1} -ge 0 ] && g ${1} 0 ; }
# repeat 300 times
f 300
-
Dnešním vítězem soutěže o největší počet WTF na znak se stává I_love_math. Získává luxusní sadu hrnců OMG. Gratulujeme!
-
#!/bin/bash
h() { echo "here is your source code in loop" ; }
g() { [ ${1} -le ${2} ] && return ; h ; t=${2} ; ((t++)) ; g ${1} ${t} ; }
f() { [ ${1} -ge 0 ] && g ${1} 0 ; }
# repeat 300 times
f 300
......... ten base case na zaciatku g() bije do oci.
Navyse, ked chcete minimalizovat a obfuskovat tak potom takto:
#!/bin/bash
h() { echo "here is your source code in loop" ; }
g() { [ ${1} -le ${2} ] && return || h; g ${1} $((1 + $2)) ; }
f() { [ ${1} -ge 0 ] && g ${1} 0 ; }
Osetrenie zapornych hodnot je ale pekne.
-
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 (http://lists.gnu.org/archive/html/bug-bash/2003-12/msg00007.html)
-
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.
Tak jsem se podival do man bash, a built-in zjistovani casu tam je, a celkem luxusni:
printf %(...)T
E.
-
Tak jsem se podival do man bash, a built-in zjistovani casu tam je, a celkem luxusni:
printf %(...)T
E.
Super, takze verzia s printf v bashi. Zmenil som este test na param 2 v f() z -ge na -gt.
#!/bin/bash
h() { echo "here is your source code in loop" ; }
g() { [ $(printf '%(%s)T' -1) -gt $end ] || [ ${1} -le ${2} ] && return ; h; g ${1} $((1 + $2)) ; }
f() { [ ${1} -ge 0 ] && [ ${2} -gt 0 ] || return; end=$(($(printf '%(%s)T' -1) + $2)) ; g ${1} 0 ; }
# param 1 = pocet cyklov, param 2 = timeout v sekundach
f 1500 7
echo "Toto sa spusti az po skonceni rekurzie - to je po timeoute alebo po dosiahnuti pozadovanej hlbky"
-
Otazka je,, ci chces riesit programovanie v C alebo build model C programov. Ak to prve, tak si stiahni nejake IDE (napr. Eclipse vo verzii pre C development nie je zla volba) a prote programuj. Ak sa chces bavit kompilaciou, pokracuj cez command line nastroje a naucis sa taktiez vela, len trosku o inom.