# Shell/Bash Anfängerfrage



## Corbin (18. März 2010)

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:

```
#! /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


----------



## Vereth (18. März 2010)

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.


----------



## deepthroat (18. März 2010)

Hi.





Vereth hat gesagt.:


> 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):

```
if [[ $z1 =~ [0-9] && [^a-zA-Z] ]]
  ...
fi
```
Und nicht vergessen zu Quoten!

```
if [[ "$z1" =~ [0-9]+ ]]; then
  ...
fi
```
Gruß


----------



## Corbin (19. März 2010)

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...


----------



## deepthroat (19. März 2010)

Hi.


```
if [[ "$z1" =~ ^[0-9]+$ ]]; then
  ...
fi
```
Gruß


----------



## Corbin (19. März 2010)

Danke, habs gelöst!


----------



## SvenW2000 (19. März 2010)

hi @all,
Wir habens 

Meine Lösung::

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


----------



## Corbin (19. März 2010)

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 (19. März 2010)

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 
	
	
	



```
if [[ blah ]]; then echo x; fi
```

Gruß


----------



## Corbin (19. März 2010)

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


----------



## Corbin (19. März 2010)

Hier nochmal für alle dies intressiert der fertige rechner 
Er speichert jetzt auch die Ergebnisse in einer neuen Datei, ansonsten so wie vorher:


```
#! /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]* && $z1 != *[a-zA-Z]* ]]
then

  echo "Nenne die zweite Zahl: "
  read z2
  if [[ $z2 = [0-9]* && $z1 != *[a-zA-Z]* ]]
    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 $erg >> Ergebnisse
                echo "Das Ergebnis ist: $erg."
                ;;

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

                3 ) erg=`expr $z1 \* $z2`
                echo >> Ergebnisse
                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?"
read antw
if $antw;
        then
                echo ""
                echo "Auf Wiedersehen"
                echo ""
                exit 1
        else
echo ""
fi
done

if test -n $erg;
then
  echo "Vielleicht stattdessen mit bisherigen Ergebnis weiterrechnen?"
  read antw2
        if test $antw2 == "ja" -o $antw2 == "j" -o $antw2 -o $antw2 == "Ja" -o $antw2 == "J" -o $antw2 == "yes" -o $antw2 == "y";
                then

                                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 >> Ergebnisse
                                                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 >> Ergebnisse
                                                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 >> Ergebnisse
                                                echo "Das Ergebnis ist: $erg2"
                                              else
                                                echo "Keine Zahl eingegeben"
                                            fi
                                        ;;

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

                                esac


                else echo ""
                     echo "Auf Wiedersehen!"
                     echo ""
                exit 2

             fi

else

  echo ""
  echo "Auf Wiedersehen"
  echo ""

  exit 3

fi


echo ""
echo "Auf Wiedersehen"
echo ""
exit 4:
```


----------



## Corbin (19. März 2010)

ups.... punkt 2 übersprungen, da fehlen 10 zeilen

```
#! /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]* && $z1 != *[a-zA-Z]* ]]
then

  echo "Nenne die zweite Zahl: "
  read z2
  if [[ $z2 = [0-9]* && $z1 != *[a-zA-Z]* ]]
    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 $erg >> Ergebnisse
                echo "Das Ergebnis ist: $erg."
                ;;

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

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

                4 ) erg=`expr $z1 / $z2`
                echo $erg >> Ergebnisse
                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?"
read antw
if $antw;
        then
                echo ""
                echo "Auf Wiedersehen"
                echo ""
                exit 1
        else
echo ""
fi
done

if test -n $erg;
then
  echo "Vielleicht stattdessen mit bisherigen Ergebnis weiterrechnen?"
  read antw2
        if test $antw2 == "ja" -o $antw2 == "j" -o $antw2 -o $antw2 == "Ja" -o $antw2 == "J" -o $antw2 == "yes" -o $antw2 == "y";
                then

                                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 $erg >> Ergebnisse
                                                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 $erg >> Ergebnisse
                                                echo "Das Ergebnis ist: $erg2"
                                              elo ""
                                              e
                                                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 $erg >> Ergebnisse
                                                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 $erg >> Ergebnisse
                                                echo "Das Ergebnis ist: $erg2"
                                              else
                                                echo "Keine Zahl eingegeben"
                                            fi
                                        ;;

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

                                esac


                else echo ""
                     echo "Auf Wiedersehen!"
                     echo ""
                exit 2

             fi

else

  echo ""
  echo "Auf Wiedersehen"
  echo ""

  exit 3

fi

echo ""
echo "Auf Wiedersehen"
echo ""
exit 4:
```

Jetzt müsste es vollständig sein


----------



## Corbin (22. März 2010)

Tut mir leid, dass ich euch noch einmal stören muss, aber kann mir einer von euch vielleicht nochmal helfen?

Ich habe ja jetzt den taschenrechner ganz fertig, das einzige was ich machen muss ist jetzt die Datei, in der alle ergebnisse gescpeichert werden (Ergebnisse) mit einem neuen Script durchsuchen lassen und sowohl die Anzahl der Ergebnisse (Anzahl der Zeilen)  als auch eine Auflistung aller Ergebnisse auszugeben...

Kann mir dabei vielleicht ejamdn helfen, denn ich hab keine ahnung wie ich das machen soll, und sowas wie ein ansatz wär schon echt gut, denn ich weiß nichtmals wie man die datei angibt die durchsucht werden soll, geschweige denn was ich da genau angeben muss...


----------



## Vereth (22. März 2010)

Kleiner Tip: schau dir mal an, was das Kommando grep macht.


----------

