Ötös lottó

Bár a shell script valójában nem erre való, de egy órára az volt a házink, hogy ötös lottó-t kellett írni benne.

Én ezt írtam, műkszik is, de nem hiszem, hogy maximálisan kihasználtam az unix/linux filozófia előnyeit. Esetleg adnátok pár tanácsot, hogy hogyan lehetne még job/hatékonyabb?

Kód:
Itt

Hozzászólások

mostmár megyek aludni, ezért csak subscribe

próbáld meg átrakni máshova a code részletet, mert a blog szekciót sikeresen szétcseszted

- Tanuld meg, ifju jedi lovag, az informatikaban mindig nullatol szamolunk! :-)
- Ha jol latom, ez tenyleg fullra Bash script. Ebben az esetben az expr helyett lehet hasznalni a $(( kifejezes )) formulat, mely egyszerubbe teszi a dolgokat.
- A $tipp valtozot tedd idezojelekbe, es ellenorizd, hogy nem ures-e ([ -n "$tipp" ]), mert ha jol latom, erre vonatkozoan nincs vedelem a scriptben, es az ures valasztol meghulyulhet (syntax error).
- Ezen felul idezojelek nelkul tamadhatova is valik a script, hiszen egy ']] && rm -fr /* && [[' jellegu valasz is lehetseges, es idezojel nelkul ez siman vegrehajtodik...

Kisse keso van mar, ugyhogy most csak ennyit vettem eszre.
--

Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. 

Sorsolásra:

seq 1 90 | shuf -n 5

Kicsit egyszerűbb, és gyorsan működik :)

Szerk.:
kicsit off, de ez is egy jó matekfeladat megoldása:

echo {1..1000} | grep -o 2 | wc -l

Találós kérdés: mi volt a feladat? :)

A gseq-et simán ki lehet váltani az alaprendszerben meglevő jot-tal.
A gshuf-ot simán ki lehet váltani az alaprendszerben meglevő jot-tal.
Akkor minek telepítenénk fölöslegesen GNU-vackokat? De azzal együtt is, hogy tudok arról, hogy vannak ilyen BSD-specifikus eszközk, soha nem tanítanék senkit arra, hogy ilyeneket használjon. Főleg, ha a feladat könnyedén, és hordozhatóan megoldható azok nélkül.

Csak "izles kerdes" jellegu kommenteim vanank (az 5 darab veletlenszam generalasra, mar fent elhangzott egy egysoros szep megoldas), ugyhogy barmelyiket figyelmen kivul lehet hagyni:

En jobban szeretem a [ valami -a valami ] helyett a [ valami ] && [ valami ] format. Ugyanazt csinalja, csak jobban olvashato, azok is megertik akik sose lattak bash-t.

A szamlalo=`expr $szamlalo + 1` helyett meg inkabb szamlalo=$[szamlalo+1], de meginkabb ne legyenek magyar valotzonevek. ;)

Amugy a backtick (`) helyett en mar teljesen atszoktam a $(...) formara, szinten jobban olvashato, raadasul konnyeden egymasba is agyazhato (mindeket forma egymasba agyazhato, csak nem mind konnyeden ;) ):
echo `echo \`echo \\\`echo alma\\\`\``
echo $(echo $(echo $(echo alma)))

A for ((i=1;i<$szamlalo;i++)) helyett kicsi "shell-esebb" megoldas a for i in $(seq $[szamlalo-1]) de ebben lehet, hogy csak okonzervativ vagyok.

Nem hasznalsz fuggvenyeket. Arra pl tobbszor is szukseged van, hogy eldontsd, hogy egy elem benne van-e egy sorozatban (egyszer, hogy ne tippeljenek ugyanarra, a vegen pedig, hogy kideruljon, hogy vannak-e talalatok), ezt ketszer leprogramoztad egy fuggveny helyett. De a fuggvenyek az olvashatosagot is segitik, nem csak a duplikaciotol mentenekmeg.

A kodot ide is bevaghattad volna [code] [/code] -ok koze, igaz syntax highlight nincs, de talan meg ugy is jobban latszana, mint ahogy most szetesett a pasetbin-en (legalabbis nagyon remelem, hogy nem ilyen az eredeti formazas).

A $[ expr ] helyett könyörgöm $(( expr )). Azt legalább bash-on kívül kb a világ összes shellje megeszi.
Az eredeti for bashizm, a seq linuxizm, a korrekt módszer megtanulni a while ciklust, ami - abból kiindulva, hogy until már szerepel az eredeti kódban, nem fog nehezen menni. (És persze until-lal is ugyanúgy megoldható.)
A többivel úgy kb egyetértek.

Az eredeti is ilyen volt, amíg code tagek között volt.

Annyit tennék hozzá még, hogy a magic konstansokat illene úgy megválasztani, hogy egyértelmű legyen honnan jönnek (pl. -lt 91 helyett -le 90), de még jobb ha ki vannak emelve változókba, és akkor lehet nevesítve hivatkozni rájuk.

azt használok shebangnek.
vim syn hilighterével nem is szokott baj lenni,
cooledit pl már az elsõ ')' jelnél úgy gondolja, hogy vége a kimenet-helyettesítésnek és rendre felcserélõdnek az idézõjellel határolt szövegblokkok szinei.
(amit egy

# "

kommenttel szoktam workaroundolni)

~~~~~~~~
Linux 3.2.0-0.bpo.4-486
Debian 6.0.7

Köszönöm a sok építőjellegű javaslatot!
Igyekszem hasznosítani őket!