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.

Bash Beispiele
mein_name="User"
echo "Mein Name ist $mein_name"

zahl=42
echo "Die Zahl ist $zahl"
Output
Mein Name ist User
Die Zahl ist 42

Erklärung

  • mein_name="User": Erstellt eine lokale Variable mit dem Namen mein_name und weist ihr den Wert User zu.
  • zahl=42: Erstellt eine weitere lokale Variable mit dem Namen zahl und weist ihr den Wert 42 zu.
  • echo: Mit echo werden 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.

Bash Beispiele
export editor="vim"
echo "Der bevorzugte Editor ist $editor"
Output
Der bevorzugte Editor ist vim

Erklä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.

Bash Beispiel
var_one="Value one"
anzahl=10
pfad="/usr/local/bin"
summe=$((5 + 3))

Erklärung

  • var_one="Value one": Weist der Variablen var_one den String „Value one“ als Wert zu.
  • anzahl=10: Weist der Variable anzahl den Wert 10 zu.
  • 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.

Bash Beispiel
echo $var_one
echo "Der Wert ist $var_one und die Zahl ist $anzahl"
Output
Value one
Der Wert ist Value one und die Zahl ist 10

Mit 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.

Bash Beispiel
zahl=5
echo $zahl

zahl=10
echo $zahl
Output
5
10

Variablen 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.

Bash Beispiel: Auflösung der Variable
greeting="Hallo"
echo "$greeting Welt"
Output
Hallo Welt

Im nächsten Beispiel sieht man die Verwendung mit einfachem Quoting. Hierbei wird $greeting direkt als Text ausgegeben.

Bash Beispiel: Ausgabe als Text
greeting="Hallo"
echo '$greeting Welt'
Output
$greeting Welt

Ersetzen von Text in einer Variable

Die Shell bietet die Möglichkeit, bestimmte Teile des Inhalts einer Variable durch andere Zeichenfolgen zu ersetzen.

Bash Beispiel: Wort ersetzen
text="Hallo Welt"
echo ${text/Welt/WordPress}
Output
Hallo WordPress

In diesem Beispiel wurde „Welt“ durch „WordPress“ ersetzt.

Im nächsten Beispiel werden bestimmte einzelne Zeichen in einem String ersetzt.

Bash Beispiel: Zeichen ersetzen
text="Hallo Welt"
echo ${text//l/L}
Output
HaLLo WeLt

Im 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.

Bash Beispiel
text="Hallo Welt"
length_of_var=${#text}
echo $length_of_var
Output
10

Numerische 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.

Bash Beispiele
a=5
b=3

summe=$((a + b))
echo $summe

produkt=$((a * b))
echo $produkt
Output
8
15

Auch kann man Werte erhöhen oder verringern, was meist in Schleifen nützlich sein kann.

Bash Beispiel
a=5
b=3

a=$((a + 1))
echo $a

b=$((b - 1))
echo $b
Output
6
2

Array Variablen

Shell-Variablen können auch Arrays sein, was es ermöglicht, mehrere Werte unter einem einzigen Variablennamen zu speichern.

Bash Beispiele: Alle Elemente ausgeben
fruits=("Apfel" "Banane" "Orange")
echo ${fruits[@]}
Output
Apfel Banane Orange

Mit der Syntax ${my_array[@]} können alle Elemente eines Arrays ausgegeben werden.

Bash Beispiel: Elemente per Index abrufen
fruits=("Apfel" "Banane" "Orange")
echo ${fruits[1]}
echo ${fruits[2]}
Output
Banane
Orange

Um 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.

Bash Beispiel
fruits=("Apfel" "Banane" "Orange")
echo ${#fruits[@]}
Output
3

Hä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

  • 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
  • Manpagesman bash für die formale Spezifikation
/ Weiter

Zurück zu Grundlagen

Zur Übersicht