Zum Inhalt springen

Bash/Arithmetische Substitution: Unterschied zwischen den Versionen

Aus Foxwiki
Keine Bearbeitungszusammenfassung
 
(11 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.


== Aufruf ==
; Format
<syntaxhighlight lang="bash" highlight="1" line copy>
$((AUSDRUCK))
</syntaxhighlight>


=== Optionen ===
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.
{| class="wikitable sortable options gnu big"
|-
! Unix !! GNU !! Parameter !! Beschreibung
|-
| || || ||
|-
|}


=== Parameter ===
Alle Token im Ausdruck durchlaufen eine Parametererweiterung, Befehlssubstitution und Entfernung von Anführungszeichen. Arithmetische Substitutionen können verschachtelt sein.
=== Umgebungsvariablen ===
=== Exit-Status ===
{| class="wikitable options col1center big"
|-
! Wert !! Beschreibung
|-
| 0 || Erfolg
|-
| >0  || Fehler
|}


== Anwendung ==
Die Auswertung arithmetischer Ausdrücke erfolgt in Ganzzahlen fester Breite ohne Überlaufprüfung – Division durch Null wird jedoch abgefangen und als Fehler erkannt.
<syntaxhighlight lang="bash" highlight="1" line copy>
</syntaxhighlight>


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


== Konfiguration ==
Shell-Variablen sind als Operanden zulässig; die Parametererweiterung wird vor der Auswertung des Ausdrucks durchgeführt.
=== Dateien ===
{| class="wikitable options big"
|-
! Datei !! Beschreibung
|-
| ||
|-
| ||
|}


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


== Anhang ==
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.
=== Siehe auch ===
<div style="column-count:2">
<categorytree hideroot=on mode="pages">{{BASEPAGENAME}}</categorytree>
</div>
----
{{Special:PrefixIndex/{{BASEPAGENAME}}/}}


=== Dokumentation ===
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.  
<!--
; Man-Page
# [https://manpages.debian.org/stable/procps/pgrep.1.de.html prep(1)]


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


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


[[Kategorie:Bash/Expansionen]]
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.


</noinclude>
Wenn möglich, sollten Bash-Benutzer versuchen, die Syntax mit eckigen Klammern zu verwenden:
$[ AUSDRUCK ]


= TMP =
Dies berechnet jedoch nur das Ergebnis von „AUSDRUCK“ und führt keine Tests durch:
echo $[365*24]
8760


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


; Eingebauten Rechenoperationen
{| class="wikitable big options"
{| class="wikitable big options"
|-
|-
Zeile 135: Zeile 98:
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.  
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  
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 8: 8#77  
* Zur Basis 16: 16#3f  
* Zur Basis 16: 16#3f  
Zeile 143: Zeile 107:
* '''Bash ab Version 2:''' Der zu berechnende Ausdruck wird in doppelte runde Klammern geschrieben: '''$((...))''' (die alte Syntax wird weiterhin unterstützt)
* '''Bash ab Version 2:''' Der zu berechnende Ausdruck wird in doppelte runde Klammern geschrieben: '''$((...))''' (die alte Syntax wird weiterhin unterstützt)


Arithmetic expansion allows the evaluation of an arithmetic expression and the substitution of the result. The format for arithmetic expansion is:
== Aufruf ==
<syntaxhighlight lang="bash" highlight="1" line copy>
</syntaxhighlight>


=== $(( EXPRESSION ))  ===
=== Optionen ===
{| class="wikitable sortable options gnu big"
|-
! Unix !! GNU !! Parameter !! Beschreibung
|-
| || || ||
|-
|}


The expression is treated as if it were within double quotes, but a double quote inside the parentheses is not treated specially.
=== Parameter ===
=== Umgebungsvariablen ===
=== Exit-Status ===
{| class="wikitable options col1center big"
|-
! Wert !! Beschreibung
|-
| 0 || Erfolg
|-
| >0  || Fehler
|}


All tokens in the expression undergo parameter expansion, command substitution, and quote removal. Arithmetic substitutions may be nested.
== Anwendung ==
 
<syntaxhighlight lang="bash" highlight="1" line copy>
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.
</syntaxhighlight>
 
The operators are roughly the same as in the C programming language. In order of decreasing precedence, the list looks like this:
 
Shell variables are allowed as operands; parameter expansion is performed before the expression is evaluated.
 
Within an expression, shell variables may also be referenced by name without using the parameter expansion syntax.
 
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.
 
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.
 
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.
 
If "BASE" is less than or equal to 36, lowercase and uppercase letters may be used interchangably to represent numbers between 10 and 35.
 
Operators are evaluated in order of precedence. Sub-expressions in parentheses are evaluated first and may override the precedence rules above.
 
Wherever possible, Bash users should try to use the syntax with square brackets:
 
$[ EXPRESSION ]
 
However, this will only calculate the result of ''EXPRESSION'', and do no tests:
 
echo $[365*24]
8760
 
=== Übungen ===


'''b=5; b=$((b+1)); echo $b'''
'''b=5; b=$((b+1)); echo $b'''
  6
  6
'''a=$((b+=10)); echo $a'''
'''a=$((b+=10)); echo $a'''
  16
  16
'''echo $((a>b?1:0))'''
'''echo $((a>b?1:0))'''
  1
  1
'''echo $((8#17**2))'''
'''echo $((8#17**2))'''
  225
  225
'''echo $((017**2))'''
'''echo $((017**2))'''
  225
  225
'''echo $((-0x64*3#11%6))'''
'''echo $((-0x64*3#11%6))'''
  -4
  -4
'''echo $((4<<1))'''
'''echo $((4<<1))'''
  8
  8
Zeile 202: Zeile 164:
'''b=$(($b+1)); echo $b'''
'''b=$(($b+1)); echo $b'''
  1
  1
== Konfiguration ==
=== Dateien ===
{| class="wikitable options big"
|-
! Datei !! Beschreibung
|-
| ||
|-
| ||
|}
<noinclude>
== Anhang ==
=== Siehe auch ===
<div style="column-count:2">
<categorytree hideroot=on mode="pages">{{BASEPAGENAME}}</categorytree>
</div>
----
{{Special:PrefixIndex/{{BASEPAGENAME}}/}}
=== Dokumentation ===
<!--
; Man-Page
# [https://manpages.debian.org/stable/procps/pgrep.1.de.html prep(1)]
; Info-Pages
-->
=== Links ===
==== Projekt ====
==== Weblinks ====
[[Kategorie:Bash/Expansionen]]
</noinclude>

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