Zum Inhalt springen

Variablen

Terminal-Fenster
NAME="Linux" # Zuweisung – kein Leerzeichen um das =!
echo "$NAME" # Verwendung – immer in Anführungszeichen
echo "Hallo $NAME" # in Strings einbetten

Variablen sind immer Strings – Bash kennt keinen Typ. Zahlen werden als Strings gespeichert und nur in arithmetischen Ausdrücken als Zahlen behandelt.

#!/bin/bash
echo "Skriptname: $0"
echo "Erstes Argument: $1"
echo "Zweites Argument: $2"
echo "Alle Argumente: $@"
echo "Anzahl Argumente: $#"
./skript.sh
./skript.sh hallo welt
# Erstes Argument: hallo
# Zweites Argument: welt
# Alle Argumente: hallo welt
# Anzahl Argumente: 2
VariableBedeutung
$0Name des Skripts
$1$9Positionsparameter 1–9
${10}Positionsparameter ab 10 (Klammern nötig!)
$@Alle Parameter als separate Wörter
$*Alle Parameter als ein Wort
$#Anzahl der Parameter
VariableBedeutung
$?Exit-Code des letzten Befehls (0 = Erfolg)
$$PID des aktuellen Skripts
$!PID des zuletzt in den Hintergrund geschickten Prozesses
$-Aktive Shell-Optionen
Terminal-Fenster
cp quelle.txt ziel.txt
echo "Exit-Code: $?" # 0 bei Erfolg, 1 bei Fehler
sleep 10 &
echo "PID des sleep: $!"

Bash bietet mächtige Möglichkeiten, Variablen beim Einsetzen zu transformieren:

Terminal-Fenster
echo "${NAME:-Unbekannt}" # Wert von NAME, oder "Unbekannt" wenn leer/undefiniert
echo "${NAME:=Standard}" # wie :- , aber weist Standard auch zu wenn leer
echo "${NAME:+Vorhanden}" # "Vorhanden" wenn NAME gesetzt, sonst leer
echo "${1:?'Argument fehlt!'}" # Fehlermeldung und Abbruch wenn $1 leer/undefiniert
#!/bin/bash
set -euo pipefail
ZIEL="${1:?'Bitte Zielverzeichnis angeben!'}"
# → Skript bricht mit Fehlermeldung ab wenn $1 fehlt
Terminal-Fenster
DATEI="/home/alice/dokumente/bericht.txt"
echo "${#DATEI}" # Länge: 38
echo "${DATEI##*/}" # Dateiname: bericht.txt (längster Präfix bis /)
echo "${DATEI%/*}" # Verzeichnis: /home/alice/dokumente (kürzestes Suffix ab /)
echo "${DATEI%.txt}" # ohne Endung: /home/alice/dokumente/bericht
echo "${DATEI/alice/bob}" # ersetzen: /home/bob/dokumente/bericht.txt
echo "${DATEI^^}" # Großbuchstaben (bash 4+)
echo "${DATEI,,}" # Kleinbuchstaben (bash 4+)
Terminal-Fenster
read -p "Name eingeben: " NAME
echo "Hallo, $NAME!"
read -sp "Passwort: " PASSWORT # -s: kein Echo (für Passwörter)
echo "" # Zeilenumbruch nach verdeckter Eingabe
read -t 10 -p "Eingabe (10s): " ANTWORT || echo "Timeout!"

read ohne Variablenname speichert die Eingabe in $REPLY.

Wie im Shell-Substitutionen-Artikel gezeigt, lässt sich die Ausgabe eines Befehls direkt in eine Variable schreiben:

Terminal-Fenster
DATUM=$(date +%Y-%m-%d)
BENUTZER=$(whoami)
ZEILENANZAHL=$(wc -l < datei.txt)
echo "Backup vom $DATUM, erstellt von $BENUTZER"