Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: fotka 31. 08. 2014, 18:31:49

Název: Bash script a přerušení while
Přispěvatel: 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

Kód: [Vybrat]
while [ "$value" -gt "$value2" ];do

$value2=$(...get_value2_command_here...)

sleep 1

done
Název: Re:Bash script , jak přerušit while po určitém čase/počtu cyklů?
Přispěvatel: fotka 31. 08. 2014, 19:05:36
jde to třeba tak, že na novou řádku před ten while loop dám
Kód: [Vybrat]
loopnumber=1a pak dovnitř toho while dám:
Kód: [Vybrat]
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)
Kód: [Vybrat]
if [ "$loopnumber" -gt "60" ];then
echo "Je to již 60 cyklů, tak to skončíme a pokračujeme dále ve skriptu"
break
fi


Název: Re:Bash script , jak přerušit while po určitém čase/počtu cyklů?
Přispěvatel: I_love_math 31. 08. 2014, 20:05:10
Kód: [Vybrat]
#!/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
Název: Re:Bash script , jak přerušit while po určitém čase/počtu cyklů?
Přispěvatel: xMartin 31. 08. 2014, 20:18:23
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!
Název: Re:Bash script , jak přerušit while po určitém čase/počtu cyklů?
Přispěvatel: kimec 31. 08. 2014, 20:58:55
Kód: [Vybrat]
#!/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:

Kód: [Vybrat]
#!/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.
Název: Re:Bash script a přerušení while
Přispěvatel: kimec 31. 08. 2014, 22:35:16
Ešte pridám verziu s časovým obmedzením:

Kód: [Vybrat]
#!/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)
Název: Re:Bash script a přerušení while
Přispěvatel: Ego 01. 09. 2014, 10:22:21
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.
Název: Re:Bash script a přerušení while
Přispěvatel: kimec 01. 09. 2014, 15:52:20
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.
Kód: [Vybrat]
#!/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"
Název: Re:Bash script a přerušení while
Přispěvatel: andrej 02. 09. 2014, 14:16:34
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.