Anwendungen
Portal
Forum
Wiki
Ikhaya
Planet
Mehr
Anmelden

Zahlen vergleichen & Übereinstimmung ausgeben

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

1
2
3
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:

1
2
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
done

und 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

Füge hinter das

exit 0 

noch ein

exit 1 

ein. ;)

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

;) So ist's besser!