Zum Inhalt springen

Bash/Arithmetische Substitution: Unterschied zwischen den Versionen

Aus Foxwiki
Zeile 143: Zeile 143:
Arithmetic expansion allows the evaluation of an arithmetic expression and the substitution of the result. The format for arithmetic expansion is:
Arithmetic expansion allows the evaluation of an arithmetic expression and the substitution of the result. The format for arithmetic expansion is:


=== $(( EXPRESSION )) ===
=== $(( AUSDRUCK )) ===


The expression is treated as if it were within double quotes, but a double quote inside the parentheses is not treated specially.  
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.  


All tokens in the expression undergo parameter expansion, command substitution, and quote removal. Arithmetic substitutions may be nested.
Alle Token im Ausdruck durchlaufen eine Parametererweiterung, Befehlssubstitution und Entfernung von Anführungszeichen. Arithmetische Substitutionen können verschachtelt sein.


Evaluation of arithmetic expressions is done in fixed-width integers with no check for overflow - although division by zero is trapped and recognized as an error.  
Die Auswertung arithmetischer Ausdrücke erfolgt in Ganzzahlen fester Breite ohne Überlaufprüfung – Division durch Null wird jedoch abgefangen und als Fehler erkannt.  


The operators are roughly the same as in the C programming language. In order of decreasing precedence, the list looks like this:
Die Operatoren entsprechen in etwa denen der Programmiersprache C. In der Reihenfolge abnehmender Priorität sieht die Liste wie folgt aus:


Shell variables are allowed as operands; parameter expansion is performed before the expression is evaluated.  
Shell-Variablen sind als Operanden zulässig; die Parametererweiterung wird vor der Auswertung des Ausdrucks durchgeführt.  


Within an expression, shell variables may also be referenced by name without using the parameter expansion syntax.  
Innerhalb eines Ausdrucks können Shell-Variablen auch ohne Verwendung der Parametererweiterungssyntax mit ihrem Namen referenziert werden.  


The value of a variable is evaluated as an arithmetic expression when it is referenced. A shell variable need not have its integer attribute turned on to be used in an expression.
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.


Constants with a leading 0 (zero) are interpreted as octal numbers. A leading "0x" or "0X" denotes hexadecimal. Otherwise, numbers take the form "[BASE'#']N", where "BASE" is a decimal number between 2 and 64 representing the arithmetic base, and N is a number in that base.  
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.  


If "BASE'#'" is omitted, then base 10 is used. The digits greater than 9 are represented by the lowercase letters, the uppercase letters, "@", and "_", in that order.  
Wenn „BASE‘#'“ weggelassen wird, wird die Basis 10 verwendet. Ziffern größer als 9 werden durch Kleinbuchstaben, Großbuchstaben, @“ und „_“ in dieser Reihenfolge dargestellt.  


If "BASE" is less than or equal to 36, lowercase and uppercase letters may be used interchangably to represent numbers between 10 and 35.
Wenn „BASE“ kleiner oder gleich 36 ist, können Klein- und Großbuchstaben austauschbar verwendet werden, um Zahlen zwischen 10 und 35 darzustellen.


Operators are evaluated in order of precedence. Sub-expressions in parentheses are evaluated first and may override the precedence rules above.
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.


Wherever possible, Bash users should try to use the syntax with square brackets:
Wenn möglich, sollten Bash-Benutzer versuchen, die Syntax mit eckigen Klammern zu verwenden:


$[ EXPRESSION ]  
$[ AUSDRUCK ]  


However, this will only calculate the result of ''EXPRESSION'', and do no tests:
Dies berechnet jedoch nur das Ergebnis von „AUSDRUCK“ und führt keine Tests durch:


echo $[365*24]
echo $[365*24]
8760
8760


=== Übungen ===
=== Übungen ===

Version vom 5. November 2025, 14:57 Uhr

Bash/Arithmetische Substitution

Beschreibung

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

Problembehebung

Konfiguration

Dateien

Datei Beschreibung


Anhang

Siehe auch



Dokumentation

Links

Projekt

Weblinks


TMP

Arithmetic expansion allows the evaluation of an arithmetic expression and the substitution of the result. The format for arithmetic expansion is:

$(( 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

Übungen

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