Bash script a přerušení while

fotka

  • ***
  • 216
    • Zobrazit profil
    • Linux forum
    • E-mail
Bash script a přerušení while
« 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

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

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

sleep 1

done
« Poslední změna: 31. 08. 2014, 21:30:21 od Petr Krčmář »
Linux nováček - CeskeForum.com


fotka

  • ***
  • 216
    • Zobrazit profil
    • Linux forum
    • E-mail
Re:Bash script , jak přerušit while po určitém čase/počtu cyklů?
« Odpověď #1 kdy: 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


Linux nováček - CeskeForum.com

I_love_math

Re:Bash script , jak přerušit while po určitém čase/počtu cyklů?
« Odpověď #2 kdy: 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

xMartin

Re:Bash script , jak přerušit while po určitém čase/počtu cyklů?
« Odpověď #3 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!

kimec

Re:Bash script , jak přerušit while po určitém čase/počtu cyklů?
« Odpověď #4 kdy: 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.


kimec

Re:Bash script a přerušení while
« Odpověď #5 kdy: 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

Ego

Re:Bash script a přerušení while
« Odpověď #6 kdy: 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.

kimec

Re:Bash script a přerušení while
« Odpověď #7 kdy: 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"

andrej

Re:Bash script a přerušení while
« Odpověď #8 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.