- Übersicht
- Über Variablenbezeichnungen
- Schritt 1: Sonderzeichen (Metazeichen)
- Schritt 2: Spezialvariablen
- Schritt 3: Parametererweiterung
- Schritt 4: Arrays und assoziative Arrays
- Schritt 5: Arithmetische Erweiterung
- Schritt 6: Bedingungen und Vergleiche
- Schritt 7: Befehlsersetzung und Subshells
- Schritt 8: Umleitung und FD-Verwaltung
- Begriff: Dateideskriptoren (FD)
- Schritt 9: Traps und Fehlersteuerung
- Schritt 10: Jobsteuerung
- Begriff: Jobnummer und %1
- Schritt 11: Sonderbefehle und reservierte Wörter
- Zusammenfassung
Ü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.
