Arithmetik in Skripts
Die expr-Anweisung erlaubt das Auswerten von arithmetischen Ausdrücken.
Das Ergebnis wird in die Standardausgabe geschrieben. Als Zahlen können 16-Bit-Integerzahlen (beim Ur-UNIX) oder 32-Bit-Integerzahlen (bei LINUX) verwendet werden (bei manchen Systemen auch noch längere Zahlen mit 64 Bit). Die Bash wurde auch an dieser Stelle erweitert. Mit der doppelten Klammerung$((Ausdruck)) kann man rechnen, ohne ein externes Programm aufzurufen.expr Ausdruck und $((Ausdruck)) beherrschen die vier Grundrechenarten:
+ | Addition |
- | Subtraktion |
* | Multiplikation |
/ | Division |
% | Divisionsrest (Modulo-Operator) |
Die Priorität "Punkt vor Strich" gilt auch hier. Außerdem können
Klammern gesetzt werden. Da die Klammern und der Stern auch von der Shell verwendet
werden, müssen diese Operationszeichen immer durch den Backslash geschützt
werden: '\*', '\(', '\)' . Damit die Operatoren von der Shell erkannt werden,
müssen sie von Leerzeichen eingeschlossen werden. Zum Beispiel eine Zuweisung der
Summe von A und B an X durch:
X=`expr $A + $B`
oder
X=$((expr $A + $B))
(Backquotes beachten!) Außerdem sind logische Operationen implementiert, die den
Wert 0 für 'wahr' und den Wert 1 für 'falsch' liefern.
expr1 | expr2 | oder |
expr1 & expr2 | und |
expr1 < expr2 | kleiner |
expr1 <= expr2 | kleiner oder gleich |
expr1 > expr2 | größer |
expr1 >= expr2 | größer oder gleich |
expr1 = expr2 | gleich |
expr1 != expr2 | ungleich |
Beispiele:
# Mittelwert der positiven Zahlen, die von stdin gelesen werden
SUM=0
COUNT=0
while read $WERT # lesen, bis zum ^D
do
COUNT=`expr $COUNT + 1`
SUM=`expr $SUM + $WERT`
done
AVINT=`expr $SUM / $COUNT`
echo "Summe: $SUM Mittelwert: $AVINT"
#Nimm-Spiel, interaktiv
ANZ=0
if test $# -ne 1
then
echo "Usage: $0 Startzahl"
else
echo "NIM-Spiel als Shell-Skript"
echo "Jeder Spieler nimmt abwechselnd 1, 2 oder 3 Hoelzer"
echo "von einem Haufen, dessen Anfangszahl beim Aufruf fest-"
echo "gelegt wird. Wer das letzte Holz nimmt, hat verloren."
echo
ANZ=$1
while [ $ANZ -gt 1 ] # bis nur noch 1 Holz
do # da ist wiederholen
echo "\nNoch $ANZ Stueck. Du nimmst (1 - 3): \c # Benutzer
read N
if [ $N -lt 1 -o $N -gt 3 ] ; then # Strafe bei Fehleingabe
N=1
fi
ANZ=`expr $ANZ - $N` # Benutzer nimmt N weg
if [ $ANZ -eq 1 ] ; then # Computer muß letztes Holz nehmen
echo "\nGratuliere, Du hast gewonnen"
exit # Prozedur verlassen
else
C=`expr \( $ANZ + 3 \) % 4 # Computerzug berechnen
if [ $C -eq 0 ] ; then
C=1 # Wenn 0 Verlustposition
fi
echo "Es bleiben $ANZ Stueck. Ich nehme ${C}.\c"
ANZ=`expr $ANZ - $C` # Computerzug abziehen
echo " Rest $ANZ"
fi
done # Dem Benutzer bleibt
echo "\nIch habe gewonnen" # das letzte Holz
fi
|