Nephilim94 schrieb:
Villt. hat ja jmd. nen paar Tipps oder nen Lösungsansatz.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 | $ bash x.sh
Zahl: a
Zahl: sdd
Zahl: 12 34
Zahl: 12
abc=12
$ dash x.sh
Zahl: a
Zahl: sdd
Zahl: 12 34
Zahl: 12
abc=12
$ cat x.sh
zahl() {
x=
while ! echo "$x" | egrep -q '^[0-9]+$'; do
read -p 'Zahl: ' x
done
echo "$x"
}
abc=$(zahl)
echo "abc=$abc"
|
Wie man sieht, das geht mit bash und auch dash.
Ciao
robert
| read -p "Bitte eine Zahl zw. 1 und 49 incl.: " zahl && (( $zahl > 0 && $zahl < 50 )) && echo fine || echo fail
Bitte eine Zahl zw. 1 und 49 incl.: 17
fine
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 |
read -p "Bitte eine Zahl zw. 1 und 49 incl.: " zahl && (( $zahl > 0 && $zahl < 50 )) && echo fine || echo fail
Bitte eine Zahl zw. 1 und 49 incl.: 0x9
fine
read -p "Bitte eine Zahl zw. 1 und 49 incl.: " zahl && (( $zahl > 0 && $zahl < 50 )) && echo fine || echo fail
Bitte eine Zahl zw. 1 und 49 incl.: 07
fine
read -p "Bitte eine Zahl zw. 1 und 49 incl.: " zahl && (( $zahl > 0 && $zahl < 50 )) && echo fine || echo fail
Bitte eine Zahl zw. 1 und 49 incl.: 09
bash: ((: 09: value too great for base (error token is "09")
fail
read -p "Bitte eine Zahl zw. 1 und 49 incl.: " zahl && (( $zahl > 0 && $zahl < 50 )) && echo fine || echo fail
Bitte eine Zahl zw. 1 und 49 incl.: 0
fail
|
0x9 ist eine Hexzahl, 07 eine Oktalzahl, mit beidem ist eher nicht zu rechnen, aber beides würde klappen und kann daher legal sein.
09 ist formatiert wie eine Oktalzahl, aber ungültig. 0 ist zu klein.
Das Ganze brauchst Du gar nicht so kompliziert machen, mit grep, awk und Konsorten. Das ist geht auch direkt mit der Shell:
read z1 z2 z3 z4 z5 z6
for i in $z1 $z2 $z3 $z4 $z5 $z6 ; do # klappere die 6 Variablen ab
if ! [ "$i" -ge 1 -a "$i" -le 49 ] ; then # prüfe ob sie außerhalb von 1..49 liegen
echo "$i ist ja wohl keine Lottozahl"
fi
done
Der if-Ausdruck hier liest sich zwar völlig unmöglich (eben so ne echte Shell-Macke !), funktioniert aber zuverlässig, auch bei wilden Zeichen.
(dazu habe ich die Abfrage invertiert: "ist NICHT [ größer/gleich 1 UND kleiner/gleich 49 ]", denn bei unzulässigen Zeichen liefert er sowieso einen Fehler zurück, und der soll ja auch erfasst werden)
Für eine Prüfung auf doppelte Zahlen wird das hier etwas schwieriger. Da würde ich die Zahlen sowieso lieber in einem Array speichern, damit geht das alles viel einfacher.
LG,
track
track schrieb:
Für eine Prüfung auf doppelte Zahlen wird das hier etwas schwieriger. Da würde ich die Zahlen sowieso lieber in einem Array speichern, damit geht das alles viel einfacher.
Einfach umbrechen, sort -u(nique) und zählen wieviele (Zeilen=Zahlen) es sind:
| echo 4 3 4 9 | tr " " "\n" | sort -u | wc -l
3
|
Nee, was'n Umstand ! So viele Programmaufrufe dazu ...
Für sowas würde ich eigentlich immer assoziative Arrays nehmen. Dann brauchst Du nur zu gucken, ob der Index schon mal vor kam.
Bei meiner Schleife oben könntest Du das sogar einfach mit anhängen:
read z1 z2 z3 z4 z5 z6
unset n # Array löschen (vorsichtshalber)
for i in $z1 $z2 $z3 $z4 $z5 $z6 ; do # klappere die 6 Variablen ab
if ! [ "$i" -ge 1 -a "$i" -le 49 ] ; then # prüfe ob sie außerhalb von 1..49 liegen:
echo "$i ist ja wohl keine Lottozahl"
fi
if ! [ "${n[i]}" = "" ] ; then # melden wenn die Arrayzelle nicht leer ist:
echo "$i kam vorher schon ${n[i]}x vor"
fi
n[i]=$(( ${n[i]} + 1 )) # zu der betreffenden Arrayzelle 1 addieren
doneund fertig ist die Laube.
LG,
track
Hii ihr,
hab jetzt aufgrund des verständnisses die Lösung von track genommen. Rest funzt aber auch. =P Danke dafür.
Ich poste einfach mal das komplette Lotto Script, wie ich es aktuell habe. Villt. hat ja noch jmd. was, was fehlt (!Schreibfehler sind egal!). Ansonsten setzte ich das Thread wieder auf 'gelöst' ist ja soweit alles klar. =)
clear
#Einlesen & Ausgabe des eigenen Tipp's
echo "Bitte geben Sie Ihren Tipp (Leerzeichengetrennt) ab: "
read z1 z2 z3 z4 z5 z6
clear
#z1=8
#z2=16
#z3=24
#z4=32
#z5=36
#z6=44
echo "Ihre Zalhen lauten: "
echo "$z1 $z2 $z3 $z4 $z5 $z6"
echo ""
echo "-----------------------"
#Ueberpruefung der Eingabe
unset n # Array laeren (vorsichtshalber)
for i in $z1 $z2 $z3 $z4 $z5 $z6 ; do # klappere die 6 Variablen ab
if ! [ "$i" -ge 1 -a "$i" -le 49 ] ; then # prae sie ausserhalb von 1..49 liegen:
echo "$i ist ja wohl keine Lottozahl"
fi
if ! [ "${n[i]}" = "" ] ; then # melden wenn die Arrayzelle nicht leer ist:
echo "$i kam vorher schon ${n[i]}x vor"
else
echo "Eingabeueberpruefung OK!"
fi
n[i]=$(( ${n[i]} + 1 )) # zu der betreffenden Arrayzelle 1 addieren
done
#Creieren der Zufallszahlen / Lottoziehung
touch lotto_temp
rnd=$((RANDOM % 49 + 1))
echo "-----------------------"
echo ""
echo "Die Ziehung ergab: "
echo ""
i=0
while [ $i -lt 6 ]
do while [ $(grep -c $rnd lotto_temp) -gt 0 ]
do rnd=$((RANDOM % 49 + 1))
done
echo $rnd >> lotto_temp
i=`expr $i + 1`
done
treffer=0
for z in $z1 $z2 $z3 $z4 $z5 $z6;
do
egrep -q "^$z\$" lotto_temp && treffer=$((treffer + 1))
done
#Auswertung der getippten Zahlen
sort -n lotto_temp | paste -d ' ' -s
rm lotto_temp
echo "-----------------------"
if [ $treffer == 0 ];
then
echo ""
echo "Leider ergab die Ziehung fuer Sie keinen Treffer."
echo ""
elif [ $treffer == 1 ];
then
echo ""
echo "Sie haben 1ne Zahl richtig! "
echo ""
elif [ $treffer == 5 ];
then
echo ""
echo "Richtig gut! 5 richtige, das haette schon nen euro fuenfzig gegeben!"
echo ""
elif [ $treffer == 6 ];
then
echo ""
echo "Ich gratuliere! Haetten Sie wirklich Lotto gespielt waeren Sie jetzt reich! Tjaaa, c'est la vie. :/"
echo ""
else
echo ""
echo "Sie haben $treffer Zahlen richtig! "
echo ""
fi
echo "-----------------------"
exit 0
Exit's nachgetragen! 
while [ $i -lt 6 ]
do while [ $(grep -c $rnd lotto_temp) -gt 0 ]
do rnd=$((RANDOM % 49 + 1))
done
echo $rnd >> lotto_temp
i=`expr $i + 1`
done
treffer=0
for z in $z1 $z2 $z3 $z4 $z5 $z6;
do
egrep -q "^$z\$" lotto_temp && treffer=$((treffer + 1))
done
#Auswertung der getippten Zahlen
sort -n lotto_temp | paste -d ' ' -s
rm lotto_temp
echo "---------------------------------|"
if [ $treffer == 0 ];
then
echo " ----------------|"
echo "Leider ergab die Ziehung fuer Sie keinen Treffer. |"
echo " ----------------|"
elif [ $treffer == 1 ];
then
echo " |"
echo "Sie haben 1ne Zahl richtig! |"
echo " |"
elif [ $treffer == 5 ];
then
echo " ----------------------------------|"
echo "Richtig gut! 5 richtige, das haette schon nen euro fuenfzig gegeben!|"
echo " ----------------------------------|"
elif [ $treffer == 6 ];
then
echo " ------------------------------------------------------------------|"
echo "Ich gratuliere! Haetten Sie wirklich Lotto gespielt waeren Sie jetzt reich! Tjaaa, c'est la vie. :/ |"
echo " ------------------------------------------------------------------|"
else
echo " |"
echo "Sie haben $treffer Zahlen richtig! |"
echo " |"
fi
echo "---------------------------------|"
exit 0
exit 1
exit 2
exit 3
exit 4
exit 5