Zum Inhalt springen

Bash/Arithmetische Substitution: Unterschied zwischen den Versionen

Aus Foxwiki
 
(4 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 2: Zeile 2:


== Beschreibung ==
== Beschreibung ==
Die arithmetische Erweiterung ermöglicht die Auswertung eines arithmetischen Ausdrucks und die Ersetzung des Ergebnisses.
; Format
$((AUSDRUCK))
Der Ausdruck wird so behandelt, als stünde er in doppelten Anführungszeichen, aber ein doppeltes Anführungszeichen innerhalb der Klammern wird nicht speziell behandelt.
Alle Token im Ausdruck durchlaufen eine Parametererweiterung, Befehlssubstitution und Entfernung von Anführungszeichen. Arithmetische Substitutionen können verschachtelt sein.
Die Auswertung arithmetischer Ausdrücke erfolgt in Ganzzahlen fester Breite ohne Überlaufprüfung – Division durch Null wird jedoch abgefangen und als Fehler erkannt.
Die Operatoren entsprechen in etwa denen der Programmiersprache C. In der Reihenfolge abnehmender Priorität sieht die Liste wie folgt aus:
Shell-Variablen sind als Operanden zulässig; die Parametererweiterung wird vor der Auswertung des Ausdrucks durchgeführt.
Innerhalb eines Ausdrucks können Shell-Variablen auch ohne Verwendung der Parametererweiterungssyntax mit ihrem Namen referenziert werden.
Der Wert einer Variablen wird bei ihrer Referenzierung als arithmetischer Ausdruck ausgewertet. Eine Shell-Variable muss nicht über das Attribut „integer” verfügen, um in einem Ausdruck verwendet werden zu können.
Konstanten mit einer führenden 0 (Null) werden als Oktalzahlen interpretiert. Ein führendes „0x” oder „0X” bezeichnet Hexadezimalzahlen. Andernfalls haben Zahlen die Form „[BASE'#‚]N“, wobei „BASE“ eine Dezimalzahl zwischen 2 und 64 ist, die die arithmetische Basis darstellt, und N eine Zahl in dieser Basis ist.
Wenn „BASE‘#'“ weggelassen wird, wird die Basis 10 verwendet. Ziffern größer als 9 werden durch Kleinbuchstaben, Großbuchstaben, „@“ und „_“ in dieser Reihenfolge dargestellt.
Wenn „BASE“ kleiner oder gleich 36 ist, können Klein- und Großbuchstaben austauschbar verwendet werden, um Zahlen zwischen 10 und 35 darzustellen.
Operatoren werden in der Reihenfolge ihrer Priorität ausgewertet. Unterausdrücke in Klammern werden zuerst ausgewertet und können die oben genannten Prioritätsregeln außer Kraft setzen.
Wenn möglich, sollten Bash-Benutzer versuchen, die Syntax mit eckigen Klammern zu verwenden:
$[ AUSDRUCK ]
Dies berechnet jedoch nur das Ergebnis von „AUSDRUCK“ und führt keine Tests durch:
echo $[365*24]
8760
; Eingebauten Rechenoperationen
; Eingebauten Rechenoperationen
{| class="wikitable big options"
{| class="wikitable big options"
Zeile 101: Zeile 136:
</syntaxhighlight>
</syntaxhighlight>


=== Problembehebung ===
'''b=5; b=$((b+1)); echo $b'''
6
 
'''a=$((b+=10)); echo $a'''
16
 
'''echo $((a>b?1:0))'''
1
 
'''echo $((8#17**2))'''
225
 
'''echo $((017**2))'''
225
 
'''echo $((-0x64*3#11%6))'''
-4
 
'''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:
 
'''b="Ist b keine Zahl, wird b zu 0 konvertiert"
echo $b'''
Ist b keine Zahl, wird b zu 0 konvertiert
'''b=$(($b+1)); echo $b'''
1


== Konfiguration ==
== Konfiguration ==
Zeile 139: Zeile 201:


</noinclude>
</noinclude>
= TMP =
Die arithmetische Erweiterung ermöglicht die Auswertung eines arithmetischen Ausdrucks und die Ersetzung des Ergebnisses.
Das Format für die arithmetische Erweiterung lautet:
$((AUSDRUCK))
Der Ausdruck wird so behandelt, als stünde er in doppelten Anführungszeichen, aber ein doppeltes Anführungszeichen innerhalb der Klammern wird nicht speziell behandelt.
Alle Token im Ausdruck durchlaufen eine Parametererweiterung, Befehlssubstitution und Entfernung von Anführungszeichen. Arithmetische Substitutionen können verschachtelt sein.
Die Auswertung arithmetischer Ausdrücke erfolgt in Ganzzahlen fester Breite ohne Überlaufprüfung – Division durch Null wird jedoch abgefangen und als Fehler erkannt.
Die Operatoren entsprechen in etwa denen der Programmiersprache C. In der Reihenfolge abnehmender Priorität sieht die Liste wie folgt aus:
Shell-Variablen sind als Operanden zulässig; die Parametererweiterung wird vor der Auswertung des Ausdrucks durchgeführt.
Innerhalb eines Ausdrucks können Shell-Variablen auch ohne Verwendung der Parametererweiterungssyntax mit ihrem Namen referenziert werden.
Der Wert einer Variablen wird bei ihrer Referenzierung als arithmetischer Ausdruck ausgewertet. Eine Shell-Variable muss nicht über das Attribut „integer” verfügen, um in einem Ausdruck verwendet werden zu können.
Konstanten mit einer führenden 0 (Null) werden als Oktalzahlen interpretiert. Ein führendes „0x” oder „0X” bezeichnet Hexadezimalzahlen. Andernfalls haben Zahlen die Form „[BASE'#‚]N“, wobei „BASE“ eine Dezimalzahl zwischen 2 und 64 ist, die die arithmetische Basis darstellt, und N eine Zahl in dieser Basis ist.
Wenn „BASE‘#'“ weggelassen wird, wird die Basis 10 verwendet. Ziffern größer als 9 werden durch Kleinbuchstaben, Großbuchstaben, „@“ und „_“ in dieser Reihenfolge dargestellt.
Wenn „BASE“ kleiner oder gleich 36 ist, können Klein- und Großbuchstaben austauschbar verwendet werden, um Zahlen zwischen 10 und 35 darzustellen.
Operatoren werden in der Reihenfolge ihrer Priorität ausgewertet. Unterausdrücke in Klammern werden zuerst ausgewertet und können die oben genannten Prioritätsregeln außer Kraft setzen.
Wenn möglich, sollten Bash-Benutzer versuchen, die Syntax mit eckigen Klammern zu verwenden:
$[ AUSDRUCK ]
Dies berechnet jedoch nur das Ergebnis von „AUSDRUCK“ und führt keine Tests durch:
echo $[365*24]
8760

Aktuelle Version vom 5. November 2025, 15:20 Uhr

Bash/Arithmetische Substitution

Beschreibung

Die arithmetische Erweiterung ermöglicht die Auswertung eines arithmetischen Ausdrucks und die Ersetzung des Ergebnisses.

Format
$((AUSDRUCK))

Der Ausdruck wird so behandelt, als stünde er in doppelten Anführungszeichen, aber ein doppeltes Anführungszeichen innerhalb der Klammern wird nicht speziell behandelt.

Alle Token im Ausdruck durchlaufen eine Parametererweiterung, Befehlssubstitution und Entfernung von Anführungszeichen. Arithmetische Substitutionen können verschachtelt sein.

Die Auswertung arithmetischer Ausdrücke erfolgt in Ganzzahlen fester Breite ohne Überlaufprüfung – Division durch Null wird jedoch abgefangen und als Fehler erkannt.

Die Operatoren entsprechen in etwa denen der Programmiersprache C. In der Reihenfolge abnehmender Priorität sieht die Liste wie folgt aus:

Shell-Variablen sind als Operanden zulässig; die Parametererweiterung wird vor der Auswertung des Ausdrucks durchgeführt.

Innerhalb eines Ausdrucks können Shell-Variablen auch ohne Verwendung der Parametererweiterungssyntax mit ihrem Namen referenziert werden.

Der Wert einer Variablen wird bei ihrer Referenzierung als arithmetischer Ausdruck ausgewertet. Eine Shell-Variable muss nicht über das Attribut „integer” verfügen, um in einem Ausdruck verwendet werden zu können.

Konstanten mit einer führenden 0 (Null) werden als Oktalzahlen interpretiert. Ein führendes „0x” oder „0X” bezeichnet Hexadezimalzahlen. Andernfalls haben Zahlen die Form „[BASE'#‚]N“, wobei „BASE“ eine Dezimalzahl zwischen 2 und 64 ist, die die arithmetische Basis darstellt, und N eine Zahl in dieser Basis ist.

Wenn „BASE‘#'“ weggelassen wird, wird die Basis 10 verwendet. Ziffern größer als 9 werden durch Kleinbuchstaben, Großbuchstaben, „@“ und „_“ in dieser Reihenfolge dargestellt.

Wenn „BASE“ kleiner oder gleich 36 ist, können Klein- und Großbuchstaben austauschbar verwendet werden, um Zahlen zwischen 10 und 35 darzustellen.

Operatoren werden in der Reihenfolge ihrer Priorität ausgewertet. Unterausdrücke in Klammern werden zuerst ausgewertet und können die oben genannten Prioritätsregeln außer Kraft setzen.

Wenn möglich, sollten Bash-Benutzer versuchen, die Syntax mit eckigen Klammern zu verwenden:

$[ AUSDRUCK ] 

Dies berechnet jedoch nur das Ergebnis von „AUSDRUCK“ und führt keine Tests durch:

echo $[365*24]
8760


Eingebauten Rechenoperationen
VAR++ and VAR-- variable post-increment and post-decrement
++VAR and --VAR variable pre-increment and pre-decrement
+ - 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
, separator between expressions

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

Die 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 alte Syntax wird weiterhin unterstützt)

Aufruf

Optionen

Unix GNU Parameter Beschreibung

Parameter

Umgebungsvariablen

Exit-Status

Wert Beschreibung
0 Erfolg
>0 Fehler

Anwendung

b=5; b=$((b+1)); echo $b

6

a=$((b+=10)); echo $a

16

echo $((a>b?1:0))

1

echo $((8#17**2))

225

echo $((017**2))

225

echo $((-0x64*3#11%6))

-4

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:

b="Ist b keine Zahl, wird b zu 0 konvertiert"

echo $b
Ist b keine Zahl, wird b zu 0 konvertiert

b=$(($b+1)); echo $b

1

Konfiguration

Dateien

Datei Beschreibung


Anhang

Siehe auch



Dokumentation

Links

Projekt

Weblinks