[ misa vranje @ 14.09.2004. 21:50 ] @
Koristim knjigu Linux programiranje,Majstor za Unix i skidao sam neke tutoriale zeleci da naucim BASH programiranje.Pravim jedan skript sa nekim menijem i kasnije idu meni za meni i opet meni i opet meni itd.
Problemi:
1)Da bih napravio opciju "back" potrebna mi je komanda kao sto je u Pascalu i C++ : "go to" ili da koristim svaku komandu kao odvojenu funkciju sto trazi dosta vremena i cini mi se da se petlje nemogu preklapati u BASH-u.Za goto u svim tim izvorima koje sam naveo nema nista.
U sustini trazim samo da mi odgovorite koja je u BASH-u zamena za GO TO ako postoji?
Ne zelim odgovor da samo amateri koriste go to itd. nego konkretno resenje ako go to za Bash nepostoji.
2)Kako se u BASH-u prave blokovi naredbe (kao sto je u Pascalu begin i end ili u C++ {})
hvala
[ caiser @ 14.09.2004. 22:11 ] @
Ako sam te dobro shvatio

funkcija() {
neka_komanda
jos_jedna_komanda
miljan_smara_sa_donjim_crtama
}

I to posle pozivas sa funkcija.
[ misa vranje @ 15.09.2004. 19:17 ] @
Go To?
[ TiXo @ 15.09.2004. 21:06 ] @
Pa ako imaš blokove naredbi(funkcije) i petlje, ne treba ti goto.
Pogledaj kako je rađen BashBurn jesi mislio na ovakav nekakav meni?
[ misa vranje @ 18.09.2004. 14:40 ] @
Da,na takav sam meni mislio.Jos jedno pitanje:
Kako da iz nekog fajla procitam neki odredjeni red?
Na primer hocu promenljivoj $REC da dodelim vrednost iz 53-ce linije fajla promenljive.txt.
[ TiXo @ 18.09.2004. 16:41 ] @
hm, ne pada mi ništa bolje na pamet od:
Code:
sed -n 53p'' promenljive.txt

tj
Code:
REC=`sed -n 53p'' promenljive.txt`
u samoj skripti.

P.S. trebalo bi i da može bez onih '' iza p, ali ovo je sigurno za svaki sed
[ random @ 19.09.2004. 00:04 ] @
REC=`head -n 53 promenljive.txt|tail -n 1`

Jedna od onih sitnica koje se rade na milion načina...
[ Gojko Vujovic @ 19.09.2004. 11:01 ] @
REC=`echo 53 | ed -s promenljive.txt`
[ Gojko Vujovic @ 19.09.2004. 11:16 ] @
Kraća verzija Vrzinog rešenja:

REC=`head -53 promenljive.txt|tail -1`
[ Gojko Vujovic @ 19.09.2004. 11:30 ] @
U ovo će vam se dopasti:

REC=`P=0&&while read L;do let P+=1;((P==53))&&echo $L;done<promenljive.txt`
[ Gojko Vujovic @ 19.09.2004. 11:53 ] @
Idemo perl:

REC=`perl -e '++$*==53&&print$_ while<>'<promenljive.txt`
[ Gojko Vujovic @ 19.09.2004. 12:11 ] @
Zatim AWK:

REC=`awk '{if(++a==53)print}' promenljive.txt`
[ Gojko Vujovic @ 19.09.2004. 13:16 ] @
Mislim da imamo favorita za bash bultins rešenje:

REC=`P=0;while((P++!=53));do read L;done<promenljive.txt;echo $L`
[ Gojko Vujovic @ 19.09.2004. 13:33 ] @
Ukrao sam od vrider-a ideju sa grepovanjem numerisane linije i doradio je:

REC=`nl -w1 promenljive.txt|grep ^53|cut -f 2-`
[ TiXo @ 19.09.2004. 14:04 ] @
A ako ima preko 529 parametara? :))))
Code:
nl -w3 -n rz promenljive.txt|grep ^053|cut -f 2-

[ Gojko Vujovic @ 19.09.2004. 14:21 ] @
Pa nema uopšte potrebe, ono prvo je univerzalno.

Evo za 535tu liniju:

Code:

zermatt:~/test# seq 1000 > t
zermatt:~/test# tail t
991
992
993
994
995
996
997
998
999
1000
zermatt:~/test# nl -w1 t| grep ^535|cut -f 2-
535


Nego ajmo varijacije, da vas vidim. :) Kraće, kriptičnije ili efikasnije, nešto od toga se ceni.
[ Gojko Vujovic @ 19.09.2004. 14:50 ] @
Skratio sam AWK rešenje za tri bajta:

REC=`awk '++a~/53/{print}' promenljive.txt`
[ Dejan Lozanovic @ 19.09.2004. 15:16 ] @
REC=`./a.out 53`

za neupucene a.out je moj C program ))
[ filmil @ 19.09.2004. 16:00 ] @
Dobih od šefa domaći zadatak da priložim rešenje u Pythonu. Ispisuje 53. liniju datoteke koju dobije na stdin.
Code:

 python -c 'import sys; print sys.stdin.readlines()[52],'
[ Gojko Vujovic @ 19.09.2004. 16:18 ] @
Filip je ukazao na grešku u grep rešenju odozgo. Ako postoji 53, 530,531,.. i slične linije ispisivalo bi ih sve greškom.

Ovo je otprilike rešenje i tog problema:

nl -w1 fajl|grep ^53[[:space:]]
[ VRider @ 19.09.2004. 16:53 ] @
Code:
nl -w1 fajl|grep ^53\ 

Malo krace.
[ Gojko Vujovic @ 19.09.2004. 17:26 ] @
Samo to tvoje meni ne radi. Debian linux, sve standardno iz stable distribucije. Kopirao sam celu komandu sa sve trailing space-om.
[ chupcko @ 19.09.2004. 18:47 ] @
Code:
[desktop] 0 /home/chupcko => seq 1000 | awk '++a~/53/{print}'
53
153
253
353
453
530
531
532
533
534
535
536
537
538
539
553
653
753
853
953


Skoro da je tacno :).

mozda je bolje koristiti == 53
Code:
[desktop] 0 /home/chupcko => seq 1000 | awk '++a==53{print}'
53


Ali najbolje je ipak:
Code:
[desktop] 0 /home/chupcko => seq 1000 | awk 'NR==53{print}'
53
[ chupcko @ 19.09.2004. 18:58 ] @
A i perl (hvala Gojko)

Code:

[desktop] 0 /home/chupcko => seq 100 | perl -e '$.==53&&print while<>'
53
[ TiXo @ 19.09.2004. 19:07 ] @
Citat:
Gojko Vujovic:
Pa nema uopšte potrebe, ono prvo je univerzalno.

Evo za 535tu liniju:

Code:

zermatt:~/test# seq 1000 > t
zermatt:~/test# tail t
991
<skip>
999
1000
zermatt:~/test# nl -w1 t| grep ^535|cut -f 2-
535


Nego ajmo varijacije, da vas vidim. :) Kraće, kriptičnije ili efikasnije, nešto od toga se ceni.


ama nije reč o tome, nego o prethodnom rešenju koje će za ^53 da ti vrati i 530, 531... 5378... 53890... :) a sa ^053 a postavljeno w3 dobijaš samo 53.

mada, nije ni bitno :)

BTW, jesmo mi to oterali čoveka ljubaznim odgovorima :)

izmenjeno "vreti" u "vrati" :)

[Ovu poruku je menjao TiXo dana 20.09.2004. u 00:20 GMT]
[ VRider @ 19.09.2004. 19:19 ] @
Jedna od najboljih tema u poslednje vreme ovde. Treba samo izbrisati off-topic u prve 2-3 poruke.
[ misa vranje @ 19.09.2004. 23:43 ] @
Hvala vam puno.Neznam puno tj. ne znam nista od awk-a, perla, pythona itd. ali ima vremena.Prvo da naucim shell scripting(BASH).Sve ovo me zanima da bih napravio jedan conf fajl za moj mali programcic.Program bi iz njega uzimao vrednosti promenljivih.Mada nije bas user frendly kada korisnik nezna koju promenljivu oznacava koji red,zar ne?
Znam da sam dosadan ali ako biste hteli da mi odgovorite kako da napravim da se u fajlu u 53cem redu nalazi na primer:
REC="nesto"
a da se u promenljivu ucita samo "nesto" tj. kako da ispisivanje 53ceg reda na ekranu preskoci REC=" i " .
Hvala
[ Gojko Vujovic @ 20.09.2004. 17:41 ] @
Kako volim ovaj Perl:

REC=`perl -e '$.==53&&/\"(.+)\"/&&print $1 while<>' < fajl`

Aj neko krace od ovoga? ;)
[ random @ 20.09.2004. 17:57 ] @
Citat:
misa vranje: Hvala vam puno.Neznam puno tj. ne znam nista od awk-a, perla, pythona itd. ali ima vremena.Prvo da naucim shell scripting(BASH).Sve ovo me zanima da bih napravio jedan conf fajl za moj mali programcic.Program bi iz njega uzimao vrednosti promenljivih.Mada nije bas user frendly kada korisnik nezna koju promenljivu oznacava koji red,zar ne?
Znam da sam dosadan ali ako biste hteli da mi odgovorite kako da napravim da se u fajlu u 53cem redu nalazi na primer:
REC="nesto"
a da se u promenljivu ucita samo "nesto" tj. kako da ispisivanje 53ceg reda na ekranu preskoci REC=" i " .
Hvala


Ne razmišljaš uopšte praktično, tj. bespotrebno komplikuješ. Ako ti treba da definišeš promenljive u conf fajlu, jednostavno napravi konfiguracioni fajl u obliku mini-sh-skripta koji samo definiše promenljive (i onda, naravno, nije ni bitno kojim redom). Recimo neka se zove ~/.mojrc i neka izgleda ovako:

Code:

# ovde idu promenljive za konfiguraciju skripta XY:
REC=23
START=1
END=128
TEXT="neki tekst"
# i tako dalje...


i onda ga samo source-uješ iz glavnog shell skripta (ako postoji i može da se čita):

Code:

if [ -r ~/.mojrc ]; then
   . ~/.mojrc
fi


P.S. „Ne zna“ i „ne znam“ se piše odvojeno. Posle tačke i zareza (a bogami i pre otvorene zagrade) stavlja se razmak.

[Ovu poruku je menjao random dana 20.09.2004. u 20:02 GMT]
[ Gojko Vujovic @ 20.09.2004. 17:59 ] @
Varijacija na temu ali nije krace:

perl -e '$.==53&&s/.+\"(.+)\"/$1/&&print while<>' < fajl
[ Gojko Vujovic @ 22.09.2004. 23:33 ] @
Neverovatno ali istinito, perl to može i kraće:

perl -e '$.==53&&/"(.+)"/&print$1while<>'<fajl

Da podsetim, vraća test ako je na 53. liniji nesto="test", što je bio drugi deo zadatka.