Vollständiger Leitfaden zu Bash-Sonderkonstruktionen, Spezialvariablen und Erweiterungen

Übersicht

Dieser Artikel bietet eine vollständige, systematische Zusammenfassung aller speziellen Konstruktionen, Variablen, Erweiterungs- und Steuerungsregeln in Bash.


Über Variablenbezeichnungen

Dynamische oder umgebungsabhängige Werte werden als <<Variable>> dargestellt, um die Verwendung klar zu machen.

Variable Beispiel Beschreibung
<<var>> name, path, user Beliebiger Variablenname
<<default>> guest, 8080 Standard- oder Ersatzwert
<<pattern>> *.txt, */ Dateiname oder Muster
<<offset>> 0, 3 Startposition (0-basiert)
<<length>> 4, 10 Länge des Teilstrings
<<prefix>> ENV_, HOST Präfix für Variablennamen
<<index>> 0, 1, 2 Index oder Schlüssel
<<file>> /tmp/test.txt Dateipfad

Schritt 1: Sonderzeichen (Metazeichen)

Zeichen Bedeutung Beispiel
* Beliebige Zeichenkette ls *.txt
? Ein einzelnes Zeichen ls ?.sh
[a-z] Bereichsmuster ls [A-Z]*
{a,b} Brace Expansion mv {foo,bar}
{1..3} Sequenz touch file{1..3}.txt
$ Variablenerweiterung echo $HOME
! (Negation) logische Negation [[ ! -f test.txt ]]
! (History) Verlaufserweiterung !10
~ Home-Verzeichnis cd ~
; Befehlstrennung pwd; ls
&& bei Erfolg make && echo OK
` `
& Hintergrundprozess sleep 5 &
` ` Pipe
> Umleitung stdout echo hi > out.txt
>> Anfügen echo hi >> out.txt
< Eingabeumleitung wc -l < file.txt
() Subshell (cd /tmp; ls)
{} Gleiche Shell { echo A; echo B; }
\ Escape echo \$HOME
' ' Literal echo '$USER'
" " Erweiterung aktiv echo "$USER"

Schritt 2: Spezialvariablen

Variable Inhalt Beispiel
$0 Skriptname echo $0
$1–$9 Argumente echo $1
$@ Argumentarray for a in "$@"; do echo $a; done
$# Anzahl Argumente echo $#
$? Exit-Code des letzten Befehls ls /nope; echo $?
$$ Prozess-ID echo $$
$! PID des letzten Hintergrundprozesses sleep 10 & echo $!
$- Aktive Shell-Optionen echo $-
$_ Letztes Argument des letzten Befehls echo $_
$PPID Elternprozess-ID echo $PPID
$RANDOM Zufallszahl echo $RANDOM
$SECONDS Sekunden seit Start echo $SECONDS
$FUNCNAME Funktionsname myf(){ echo $FUNCNAME; }; myf
$PIPESTATUS[@] Exit-Codes in Pipeline `ls

Schritt 3: Parametererweiterung

Syntax Bedeutung Beispiel
${<<var>>} Variable name=user; echo ${name}
${<<var>>:-<<default>>} Fallbackwert echo ${user:-guest}
${<<var>>:=<<default>>} Fallback + Zuweisung echo ${port:=8080}
${<<var>>:+alt} Alternative, falls definiert x=1; echo ${x:+OK}
${<<var>>:?msg} Fehlermeldung, falls undefiniert echo ${config:?missing}
${#<<var>>} Länge echo ${#name}
${<<var>>%<<pattern>>} Entfernt kürzestes Suffix echo ${path%/*}
${<<var>>%%<<pattern>>} Entfernt längstes Suffix echo ${path%%/*}
${<<var>>#<<pattern>>} Entfernt kürzestes Präfix echo ${path#*/}
${<<var>>##<<pattern>>} Entfernt längstes Präfix echo ${path##*/}
${<<var>>/<<pattern>>/<<repl>>} Erstes Vorkommen ersetzen echo ${msg/foo/bar}
${<<var>>//<<pattern>>/<<repl>>} Alle Vorkommen ersetzen echo ${msg// /_}
${<<var>>:<<offset>>} Teilstring ab Position s=abcdef; echo ${s:2}
${<<var>>:<<offset>>:<<length>>} Teilstring mit Länge echo ${s:1:3}
${!<<prefix>>*} Variablen mit Präfix HOST1=x; HOST2=y; echo ${!HOST*}
${!<<var>>} Indirekte Referenz ref=NAME; NAME=user; echo ${!ref}
${<<var>>,} / ${<<var>>^^} Groß-/Kleinschreibung n=abc; echo ${n^^}
${<<var>>@Q} Quoting x='abc'; echo ${x@Q}

Schritt 4: Arrays und assoziative Arrays

arr=(a b c)
echo ${arr[<<index>>]}
echo ${#arr[@]}
for i in "${arr[@]}"; do echo $i; done

declare -A map
map[<<index>>]=100
map[name]=user
echo ${map[<<index>>]}
echo ${!map[@]}

Schritt 5: Arithmetische Erweiterung

x=5; y=3
echo $((x + y))
((x *= 2))
echo $x

Schritt 6: Bedingungen und Vergleiche

if [ "$USER" = "root" ]; then echo root; fi
if [ "$x" -lt 10 ]; then echo small; fi
if [ -f /etc/passwd ]; then echo exists; fi
s="hello123"
[[ $s =~ [0-9]+ ]] && echo number

Schritt 7: Befehlsersetzung und Subshells

echo "Heute: $(date +%Y-%m-%d)"
(cd /tmp; ls)

Schritt 8: Umleitung und FD-Verwaltung

echo "Hello" > <<file>>
echo "Append" >> <<file>>
wc -l < <<file>>
ls /notfound 2> err.log
echo "OK" >&2
exec 3> custom.log
echo "via fd3" >&3
exec 3>&-

Begriff: Dateideskriptoren (FD)

FD Name Beschreibung Beispiel
0 stdin Eingabe < file.txt
1 stdout Ausgabe echo test > out.txt
2 stderr Fehlerausgabe ls /nope 2> err.log
3+ Benutzerdefiniert Eigene Streams exec 3> log.txt

FD3 ist ein benutzerdefinierter Dateideskriptor, z. B.:

exec 3> process.log
echo "Start" >&3
exec 3>&-

Schritt 9: Traps und Fehlersteuerung

set -e
set -u
set -x
set -o pipefail

trap 'echo Beendet' EXIT
trap 'echo Fehler' ERR

Schritt 10: Jobsteuerung

sleep 10 &
jobs
fg %1
bg %1
disown %1
kill %1

Begriff: Jobnummer und %1

Ein mit & gestarteter Prozess wird als Job verwaltet.
Mit jobs erhält man die Übersicht:

sleep 60 &
jobs

Ausgabe:

[1]+  Running  sleep 60 &
  • [1] → Jobnummer
  • %1 → Referenz auf Job 1
Symbol Bedeutung
%1 Job 1
%+ Aktueller Job
%- Vorheriger Job

Beispiel:

fg %1
bg %1
kill %1

Schritt 11: Sonderbefehle und reservierte Wörter

:        # tut nichts
true
false
source ~/.bashrc
eval "echo executed"
{ echo A; echo B; }

Zusammenfassung

Dieser Leitfaden deckt sämtliche besonderen Konstruktionen, Variablen, Steuer- und Erweiterungsregeln in Bash ab.
Mit diesem Wissen lassen sich Skripte sicher, portabel und automatisiert gestalten – ideal für präzise Systemadministration und DevOps-Workflows.