In der Linux-Shell sind Variablen Speicherorte, die Daten enthalten können, die von Skripten, Programmen oder Benutzern verwendet werden. Sie sind wesentliche Werkzeuge zur Steuerung von Skripten und der Konfiguration der Umgebung. Lokale Variablen sind innerhalb der aktuellen Shell-Instanz sichtbar und temporär, während Umgebungsvariablen globaler Natur sind und in untergeordnete Prozesse vererbt werden können. Die richtige Handhabung dieser Variablen ist entscheidend für die effektive Nutzung von Shell-Skripten und das Arbeiten in der Linux-Umgebung.
Es gibt zwei Hauptarten von Variablen in einer Shell.
- Lokale Variablen
- Umgebungsvariablen
Diese beiden Arten von Variablen spielen eine entscheidende Rolle bei der Ausführung von Skripten und der Konfiguration der Shell-Umgebung.
Lokale Variablen
Lokale Variablen sind Variablen, die innerhalb der aktuellen Shell-Instanz definiert und verwendet werden. Diese Variablen sind nur innerhalb der aktuellen Shell-Sitzung oder innerhalb des aktuellen Skripts sichtbar und existieren nur so lange, wie die Shell-Instanz aktiv ist.
mein_name="User"
echo "Mein Name ist $mein_name"
zahl=42
echo "Die Zahl ist $zahl"Mein Name ist User
Die Zahl ist 42Erklärung
mein_name="User": Erstellt eine lokale Variable mit dem Namenmein_nameund weist ihr den WertUserzu.zahl=42: Erstellt eine weitere lokale Variable mit dem Namen zahl und weist ihr den Wert42zu.echo: Mitechowerden die Sätze ausgegeben, während die Variablen nach ihren Werten aufgelöst werden.
Umgebungsvariablen
Umgebungsvariablen sind eine spezielle Art von Variablen, die in der gesamten Shell-Umgebung, einschließlich untergeordneter Prozesse, sichtbar sind. Sie werden häufig verwendet, um Informationen wie den Pfad zu Programmsuche (PATH), den Benutzernamen (USER) und andere Systemeinstellungen zu speichern.
export editor="vim"
echo "Der bevorzugte Editor ist $editor"Der bevorzugte Editor ist vimErklärung
export editor="vim": Erstellt eine Umgebungsvariable mit dem Namen editor und weist ihr den Wert „vim“ zu.
Durch die Verwendung von export wird die Variable in die Umgebung exportiert und steht somit auch in untergeordneten Prozessen zur Verfügung.
Arbeiten mit Variablen
Die Manipulation und Bearbeitung von Variablen in einer Linux-Shell ermöglicht es, Daten effizient zu verwalten und Skripte dynamisch zu gestalten.
Zuweisen von Werten
Um einer Variable in einer Shell einen Wert zuzuweisen, verwendet man das „=“ Zeichen. Wichtig ist, dass keine Leerzeichen zwischen dem Variablennamen, dem „=“ Zeichen und dem zugewiesenen Wert stehen.
var_one="Value one"
anzahl=10
pfad="/usr/local/bin"
summe=$((5 + 3))Erklärung
var_one="Value one": Weist der Variablenvar_oneden String „Value one“ als Wert zu.anzahl=10: Weist der Variableanzahlden Wert10zu.pfad="/usr/local/bin": Weist der Variable pfad den Pfad “/usr/local/bin” zu.summe=$((5 + 3)): Berechnet die Summe der Zahlen 5 und 3 und weist das Ergebnis der Variable summe zu. (Doppelte Klammer beachten)
Zugriff auf Variablen
Um den Wert einer Variable zu verwenden oder auszugeben, setzt man ein $ vor den Namen der Variable.
echo $var_one
echo "Der Wert ist $var_one und die Zahl ist $anzahl"Value one
Der Wert ist Value one und die Zahl ist 10Mit echo gibt man die Werte der Variablen aus. Bei Verwendung innerhalb eines String mit "" wird der Variablenwert aus der Variable ausgelesen.
Ändern des Wertes einer Variable
Man kann den Wert einer bestehenden Variable jederzeit ändern, indem man ihr einfach einen neuen Wert zuweist.
zahl=5
echo $zahl
zahl=10
echo $zahl5
10Variablen in Strings verwenden
Variablen können direkt in Zeichenketten verwendet werden. Zu beachten ist, dass man das doppelte Quoting ("") verwendet, da sonst die Variablen nicht aufgelöst, sondern direkt als String (Name der Variable) ausgegeben wird.
greeting="Hallo"
echo "$greeting Welt"Hallo WeltIm nächsten Beispiel sieht man die Verwendung mit einfachem Quoting. Hierbei wird $greeting direkt als Text ausgegeben.
greeting="Hallo"
echo '$greeting Welt'$greeting WeltErsetzen von Text in einer Variable
Die Shell bietet die Möglichkeit, bestimmte Teile des Inhalts einer Variable durch andere Zeichenfolgen zu ersetzen.
text="Hallo Welt"
echo ${text/Welt/WordPress}Hallo WordPressIn diesem Beispiel wurde „Welt“ durch „WordPress“ ersetzt.
Im nächsten Beispiel werden bestimmte einzelne Zeichen in einem String ersetzt.
text="Hallo Welt"
echo ${text//l/L}HaLLo WeLtIm diesem Beispiel wurden alle „l“ durch ein „L“ ersetzt.
Länge von Variable
Man kann die Länge des Inhalts einer Variablen (d.h. die Anzahl der Zeichen) berechnen.
text="Hallo Welt"
length_of_var=${#text}
echo $length_of_var10Numerische Variablen
Shell-Variablen speichern standardmäßig alle Werte als Zeichenketten. Um mit numerischen Werten zu arbeiten, kann man für arithmetische Operationen spezielle Syntax (( ... )) verwenden.
a=5
b=3
summe=$((a + b))
echo $summe
produkt=$((a * b))
echo $produkt8
15Auch kann man Werte erhöhen oder verringern, was meist in Schleifen nützlich sein kann.
a=5
b=3
a=$((a + 1))
echo $a
b=$((b - 1))
echo $b6
2Array Variablen
Shell-Variablen können auch Arrays sein, was es ermöglicht, mehrere Werte unter einem einzigen Variablennamen zu speichern.
fruits=("Apfel" "Banane" "Orange")
echo ${fruits[@]}Apfel Banane OrangeMit der Syntax ${my_array[@]} können alle Elemente eines Arrays ausgegeben werden.
fruits=("Apfel" "Banane" "Orange")
echo ${fruits[1]}
echo ${fruits[2]}Banane
OrangeUm Elemente per Index auszugeben, wird der Index (beginnend bei 0) in den eckigen Klammern nach dem Array-Namen angegeben.
Wenn man die Länge eines Arrays, also die Anzahl der Elemente in einem Array (Variable) ermitteln möchte, sollte „#“ und die Syntax zur Ausgabe von allen Elementen verwendet werden.
fruits=("Apfel" "Banane" "Orange")
echo ${#fruits[@]}3Häufige Stolperfallen
Leerzeichen rund um `=` brechen die Zuweisung
name = "wert" ist keine Variablen-Zuweisung, sondern der Aufruf des Befehls name mit den Argumenten = und "wert" — die Shell sucht nach einem Programm namens name und scheitert mit command not found. Korrekt ist name="wert" ohne Leerzeichen. Dieselbe Regel gilt für arithmetische Zuweisungen wie summe=$((a+b)).
Lokale Variablen werden nicht an Kindprozesse vererbt
MEIN_TOKEN="abc" ist nur in der laufenden Shell sichtbar. Ein gestartetes Skript oder Programm sieht die Variable nicht. Erst export MEIN_TOKEN="abc" macht sie zur Umgebungsvariable, die an alle Kindprozesse weitergegeben wird. Mit env | grep MEIN_TOKEN prüfst du, ob ein export tatsächlich erfolgt ist.
`unset` und leere Variable sind nicht dasselbe
var="" setzt eine leere, aber existierende Variable. unset var entfernt sie komplett. In Tests verhalten sich beide oft gleich ([ -z "$var" ] ist in beiden Fällen wahr), aber ${var:-default} greift nur bei leer oder ungesetzt — ${var-default} nur bei ungesetzt. Wer Defaults sauber bauen will, sollte den Unterschied kennen.
`$var` ohne Quotes verliert Whitespace und expandiert Globs
meldung="Es ist 12 Uhr" und dann echo $meldung druckt Es ist 12 Uhr — aber als drei separate Argumente. Bei echo fällt das nicht auf, bei printf "[%s]\n" $meldung schon: drei Klammern statt einer. Außerdem wird * in der Variable zu Dateinamen expandiert. Daher: "$var" als Default-Schreibweise.
`$1`, `$2` … brauchen geschweifte Klammern bei mehrstelligen Zahlen
$10 wird als $1 gefolgt von der Ziffer 0 interpretiert. Für das zehnte Skript-Argument musst du ${10} schreiben. Gleiches Prinzip beim Anhängen: ${var}_suffix ist eindeutig, $var_suffix sucht die Variable var_suffix.
Variablen aus Subshells gehen verloren
Eine Pipe wie echo "abc" | read x setzt x in einer Subshell — nach der Pipe ist x in der Hauptshell nicht definiert. Auch ( cd /tmp; var=neu ) ändert var in der laufenden Shell nicht. Lösung: in Bash shopt -s lastpipe (für Pipes), oder Process Substitution read x < <(echo "abc"), oder gleich var=$(...).
Weiterführende Ressourcen
Externe Quellen
- Bash Reference Manual: Shell Parameters — Variablen, Parameter, Arrays formal beschrieben
- Bash Reference Manual: Shell Parameter Expansion — alle
${var}-Konstrukte - bash(1) – Linux manual page — Abschnitt „PARAMETERS“
- Arch Wiki: Environment variables — Umgebungsvariablen distroübergreifend
Verwandte Artikel
- Linux Shell — Grundlagen der Shell und ihrer Verarbeitung
- PATH — die wichtigste Umgebungsvariable im Detail
- Quoting — wann Variablen expandiert werden und wann nicht
- echo — Variablen ausgeben und debuggen
- Manpages —
man bashfür die formale Spezifikation