Shell/Bash Anfängerfrage


C

Corbin

Hey, alle zusammen!

ich muss im Moment für mein praktikum (von der schule aus) hier mit shell einen Taschenrechner programmieren, natürlich nur ganz einfach mit den 4 grundrechenarten... die leute hier im betrieb helfen uns nicht, uns ist aber erlaubt das internet zu rate zu ziehen, also vielleicht kann mir einer von euch helfen ;)

hier das script, und gleich mit das Problem:
Code:
 #! /bin/bash

clear

antw="ja"

while test $antw == "ja" -o $antw == "j" -o $antw == "Ja" -o $antw == "J" -o $antw == "y" -o $antw == "yes" -o $antw == "Yes" -o $antw == "Y"
do

echo "Wähle die erste Zahl: "
read z1

if [[ $z1 =~ [0-9] && [^a-zA-Z] ]]
then

  echo "Nenne die zweite Zahl: "
  read z2
  if [[ $z2 =~ [0-9] ]]
    then


        echo -n "Wählen sie aus: 1 - Addition, 2 - Subtraktion, 3 - Multiplikation, 4 - Division: "

        read rz
        echo ""

        case $rz in
                1 ) erg=`expr $z1 + $z2`
                echo "Das Ergebnis ist: $erg."
                ;;

                2 ) erg=`expr $z1 - $z2`
                echo "Das Ergebnis ist: $erg."
                ;;

                3 ) erg=`expr $z1 \* $z2`
                echo "Das Ergebnis ist: $erg."
                ;;

                4 ) erg=`expr $z1 / $z2`
                    echo "Das Ergebnis ist: $erg."
                ;;

                * ) echo "Nicht möglich, nur die 4 Grundrechenarten"
                ;;

        esac

  else
    echo ""
    echo "Keine Zahl eingegeben!"
    echo ""
  fi
            else
  echo ""
  echo "Keine Zahl eingeben!"
  echo ""
fi

echo ""
echo -n "Noch einmal? (ja für noch eine Runde) "
read antw
        if test -z $antw;
        then
                echo "Viel Spaß noch"
exit 1
        else

                echo ""

        fi

done

echo ""
echo "Viel Spaß noch!"
echo ""

exit 2
so, das wars soweit, nur bei dem script haben wir ein problem mit den zahlen:

ich kann bei Zahl eins (nach der programmierung zwar wie erwartet nur zahlen, und keine buchstaben anngeben, aber auch nur immer 1 zahl, was natürlich nicht sinn der aufgabe ist...

bei dem anderem kann man zwar soviele zahlen wie man will angeben, aber man kann auch zahlen in Verbindung mit Buchstaben als Variable nennen, was ja nicht so sein soll

Vielleicht könnt ihr uns ja helfen, danke im vorraus ;)
 

deepthroat

Erfahrenes Mitglied
Hi.
Das Pattern, auf das du prüfen musst, lautet:
+[0-9]
Studiere mal die Doku zum Bash Pattern Matching. Sie ist zwar in Englisch, aber mit der Sprache solltest du dich sowieso vertraut machen.
Der =~ Operator arbeitet aber mit erweiterten regulären Ausdrücken. Da mußte man dann [0-9]+ verwenden. Siehe "man bash" bzw. "man 3 regex"

Außerdem ist die zweite Bedingung des if immer wahr (kann man also getrost weglassen):
Bash:
if [[ $z1 =~ [0-9] && [^a-zA-Z] ]]
  ...
fi
Und nicht vergessen zu Quoten!
Bash:
if [[ "$z1" =~ [0-9]+ ]]; then
  ...
fi
Gruß
 
C

Corbin

Danke erstmal für die Antworten!

Leider ist es bei deinem deep noch möglich, zahlen und Buchstaben gemischt einzugeben, sowas wie 12hgf zum beispiel...

Also vielleicht hat noch jemand ne Idee, ich google erstmal weiter nach noch mehr möglichkeiten...
 
S

SvenW2000

hi @all,
Wir habens

Meine Lösung::

if [[ `echo "$z1" | grep -E ^[[:digit:]]+$` ]]
 
C

Corbin

Sry für den Doppelpost, aber ich hätte noch ne zweite ganz kurze frage, die ich leider auch nicht über google finde:

Ich habe jetzt noch einfügen müssen, dass man mit dem bisherigen ergebns weiterrechnen kann, das wollte ich mit einer case machen, an sich auczh kein problem, aber in der case gibt es nochmal eine zweite case, und wenn ich diese schließe, dann schließt sich immer meine erste case und das programm geht nicht mehr -.-

kann mir da vielleicht jemand helfen, wie man die esacs den cases zuordnet?



echo "Vielleicht stattdessen mit bisherigen Ergebnis weiterrechnen(1)? Oder lieder aufhören (rest)"
read antw2
case $antw2 in

1 ) echo ""
echo "Geben sie ihre Rechenoperation ein: 1 - Addition, 2 - Subtraktion, 3 - Multiplikation, 4 - Division"
read rz2
echo ""
case §rz2 in
1 ) echo "Geben sie eine Zahl zum hinzuaddieren ein"
read z3
if [[ $z3 = [0-9]* && $z3 != *[a-zA-Z]* ]]
then
erg2=`expr $erg + $z3`
echo "Das Ergebnis ist: $erg2"
else
echo "Keine Zahl eingegeben"
fi
;;

2 ) echo "Geben sie eine Zahl zum abziehen ein"
read z3
if [[ $z3 = [0-9]* && $z3 != *[a-zA-Z]* ]]
then
erg2=`expr $erg - $z3`
echo "Das Ergebnis ist: $erg2"
else
echo "Keine Zahl eingegeben"
fi
;;

3 ) echo "Geben Sie eine Zahl zum multiplizieren ein"
read z3
if [[ $z3 = [0-9]* && $z3 != *[a-zA-Z]* ]]
then
erg2=`expr $erg \* $z3`
echo "Das Ergebnis ist: $erg2"
else
echo "Keine Zahl eingegeben"
fi
;;

4 ) echo "Geben Sie eine Zahl zum dividieren ein"
read z3
if [[ $z3 = [0-9]* && $z3 != *[a-zA-Z]* ]]
then
erg2=`expr $erg / $z3`
echo "Das Ergebnis ist: $erg2"
else
echo "Keine Zahl eingegeben"
fi
;;



* ) echo "Nicht möglich, nur die 4 Grundrechenarten"
;;

esac

* ) echo ""
echo "Auf Wiedersehen!"
echo ""
exit 1
;;

esac
 

deepthroat

Erfahrenes Mitglied
Hi.

Du mußt den ersten Fall nur ganz normal mit ;; beenden nachdem die innere case Anweisung beendet ist.

Und verwende bitte die Code-Tags für deine Codeschnipsel: [bash] if [[ blah ]]; then echo x; fi [/bash] wird zu
Bash:
 if [[ blah ]]; then echo x; fi

Gruß
 
C

Corbin

Tut mir leid wegen den Code-tags

Danke für deine hilfe, jetz geht alles ganz gut, wir müssen es jetz nur noch in ner anderen datei speichern, denk mal das kriegen wir schon alleine bzw via google hin, ansonsten melden wir uns nochmal ;)