Fórum Root.cz

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

Název: Bash script a přerušení while
Přispěvatel: fotka kdy 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
Název: Re:Bash script , jak přerušit while po určitém čase/počtu cyklů?
Přispěvatel: fotka kdy 31. 08. 2014, 19:05:36
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



Název: Re:Bash script , jak přerušit while po určitém čase/počtu cyklů?
Přispěvatel: I_love_math kdy 31. 08. 2014, 20:05:10

#!/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 kdy 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 kdy 31. 08. 2014, 20:58:55
Citace od: I_love_math kdy 31. 08. 2014, 20:05:10

#!/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.
Název: Re:Bash script a přerušení while
Přispěvatel: kimec kdy 31. 08. 2014, 22:35:16
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)
Název: Re:Bash script a přerušení while
Přispěvatel: Ego kdy 01. 09. 2014, 10:22:21
Citace od: kimec kdy 31. 08. 2014, 22:35:16
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 kdy 01. 09. 2014, 15:52:20
Citace od: Ego kdy 01. 09. 2014, 10:22:21
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"
Název: Re:Bash script a přerušení while
Přispěvatel: andrej kdy 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.