# Berechnungen

Die Bash ist kein Taschenrechner. Dennoch besitzt sie ein erstaunliches Potenzial an eingebauten Rechenoperationen, die -- nach Prioritäten geordnet -- nachfolgende Tabelle zusammenfasst:

Operator | Bedeutung
+ - | Einstelliger Operator (Vorzeichen)
! ~ | Logische und bitweise Negation
** | Exponentialfunktion
* / % | Multiplikation, Division und Modulo-Operator
+ - | Addition, Subtraktion
<< >> | Bitweise Links-/Rechtsverschiebung
<= >= < > | Vergleiche |
== != | Gleichheit und Ungleichheit
& | Bitweises UND
^ | Bitweises Exclusive ODER
| | Bitweises ODER
&& | Logisches UND |
|| | Logisches ODER
expr ? expr : expr | Bedingte Zuweisung
=, *=, /=, %=, +=, -= <<=, >>=, &=, ^=, |= | Zuweisungen

Als Operanden sind Konstanten und Shellvariablen (deren Inhalt als long integer betrachtet wird) erlaubt. Beginnt eine Konstante mit "0", dann wird sie als oktale Zahl verstanden; steht "0x" am Anfang, handelt es sich um eine hexadezimale Konstante.
Konstanten können zu jeder Basis zwischen 2 und 64 angegeben werden, so kann die Zahl 63 u.a. wie folgt dargestellt werden:

- Zur Basis 10: `10#63`
- Zur Basis 8: `8#77`
- Zur Basis 16: `16#3f`

# Arithmetische Substitution

Die so genannte arithmetische Substitution ist der gebräuchliche Weg, um Berechnungen durchzuführen:

- Bash Versionen <2: Der zu berechnende Ausdruck wird in eckigen Klammern geschrieben: `$[...]`
- Bash ab Version 2: Der zu berechnende Ausdruck wird in doppelte runde Klammern geschrieben: `$((...))`

Die neuen Bash-Versionen verstehen auch die alte Syntax; in den folgenden Beispielen wird aber nur die neuere Schreibweise verwendet.

## Beispiele

`user@sonne> b=5; b=$((b+1)); echo $b 6 user@sonne> a=$((b+=10)); echo $a 16 user@sonne> echo $(a>b?1:0) 1 user@sonne> echo $((8#17**2)) 225 user@sonne> echo $((017**2)) 225 user@sonne> echo $((-0x64*3#11%6)) -4 user@sonne> echo $((4<<1)) 8`

Wird als Operand eine Variable benutzt, so wird versucht, deren Inhalt in eine Ganzzahl zu konvertieren. Enthält die Variable keine Zahl, wird der Inhalt zu "0" konvertiert:

`user@sonne> b="Ist b keine Zahl, wird b zu 0 konvertiert" user@sonne> echo $b Ist b keine Zahl, wird b zu 0 konvertiert user@sonne> b=$(($b+1)); echo $b 1`

Ein einfacher Weg zur Durchführung einer Berechnung ist die Verbindung einer Variablen mit einem bestimmten Typ:

`user@sonne> declare -i a=3`

Die Variable `a` ist eine Ganzzahl und wird mit 3 initialisiert. Mit einer solchen typisierten Variablen lässt sich "ganz normal" rechnen:

`user@sonne> a=a+3; echo $a 6 user@sonne> a=3**a; echo $a 729`

Ohne die Typisierung bemühen zu müssen, kann man alternativ das builtin Kommando `let` verwenden:

`user@sonne> let y="8%2" user@sonne> echo $y 0`