Dieses Modul vertieft die Bash-Programmierung und bereitet gezielt auf die LPIC-1 Prüfungsziele 105.1 (Shell-Umgebung) und 105.2 (Skripte schreiben) vor.
- 🎯 Lernziele (LPIC-1 relevant)
- 🏗 1. Variablen & Parameter-Handling
- 🔢 2. Arithmetik & Vergleiche
- 🔄 3. Kontrollstrukturen für Profis
- 🔍 4. Expansion & Debugging
- 📝 LPIC-Übungsszenarien (Day 08)
- 🧠 Wissenstest: Bash & Scripting
- Variable Mastery: Environment vs. Shell-Variablen, Argumente (
$1,$#). - Advanced Logic:
case-Statements und komplexe Tests ([[ ... ]]). - Arithmetic: Berechnungen direkt in der Shell mit
$(( ... )). - Expansion: Parameter-Substitution (Default-Werte, String-Manipulation).
- Debugging: Fehleranalyse mit
set -xund Exit-Codes.
In der LPIC-Prüfung ist der Unterschied zwischen Variablen-Typen und deren Übergabe essenziell.
- Shell-Variable: Nur in der aktuellen Instanz verfügbar (
VAR=wert). - Environment-Variable: Wird an Kindprozesse vererbt (
export VAR=wert).
Skripte können beim Aufruf Daten übernehmen:
| Parameter | Bedeutung |
|---|---|
$0 |
Name des Skripts bzw. der aufrufenden Shell. |
$1 - $9 |
Das erste bis neunte Argument. |
${10} - ${N} |
Das zehnte bis n-te Argument (geschweifte Klammern sind zwingend erforderlich!). |
$# |
Anzahl der übergebenen Argumente (ohne $0). |
$* |
Alle Argumente als eine einzige zusammenhängende Zeichenkette. |
$@ |
Alle Argumente als Liste von separaten Zeichenketten. |
$$ |
PID des aktuellen Skripts. |
$? |
Exit-Status des zuletzt ausgeführten Befehls (0 = Erfolg, >0 = Fehler). |
Important
LPIC-1 RELEVANTES PRÜFUNGSWISSEN - Parameter-Verarbeitung:
shift(Parameterverschiebung): Der Befehlshiftverschiebt alle Positionsparameter um eine Stelle nach links:$1fällt weg,$2wird zu$1,$3wird zu$2usw. Gleichzeitig verringert sich die Anzahl in$#um 1. Dies wird häufig in Schleifen zur sequenziellen Abarbeitung einer unbestimmten Anzahl von Argumenten genutzt (z.B.while [ $# -gt 0 ]; do echo $1; shift; done)."$*"vs."$@": Verwenden Sie unter Anführungszeichen fast immer"$@". Denn"$*"fasst alle Argumente zu einem String"arg1 arg2 arg3"zusammen, wodurch Dateinamen mit Leerzeichen zerreißen."$@"expandiert korrekt zu"arg1""arg2""arg3".
Die Bash kann nativ nur Ganzzahl-Arithmetik (Integers):
ERGEBNIS=$(( 5 + 3 * 2 )) # Ergebnis: 11
(( ZAHLER++ )) # InkrementVerwende in Bash-Skripten bevorzugt [[ ]] statt [ ], da es weniger fehleranfällig ist (z.B. kein Quoting bei Variablen nötig).
| Test | Bedeutung |
|---|---|
-z $VAR |
String ist leer. |
-n $VAR |
String ist NICHT leer. |
-e $FILE |
Datei/Ordner existiert. |
$A -eq $B |
Vergleich von Zahlen (equal). |
$A == $B |
Vergleich von Strings. |
Ideal für Menüs oder das Verarbeiten von Argumenten (Alternative zu vielen if-Blöcken).
case "$1" in
start)
echo "Dienst startet..." ;;
stop)
echo "Dienst stoppt..." ;;
*)
echo "Usage: $0 {start|stop}" ;;
esacLäuft so lange, wie eine Bedingung wahr ist.
while read -r line; do
echo "Verarbeite: $line"
done < datei.txtManipulation von Variablen ohne externe Tools wie sed oder cut:
${VAR:-default}: Nutze "default", fallsVARleer oder nicht definiert ist.${VAR%suffix}: Entfernt den kürzesten Suffix von hinten.${VAR#prefix}: Entfernt den kürzesten Präfix von vorne.${#VAR}: Zeigt die Anzahl der Zeichen (Länge) des Variableninhalts an.
Important
LPIC-1 RELEVANTES PRÜFUNGSWISSEN - Dateitests in Bash:
Bei Abfragen mit if [ ... ] oder [[ ... ]] sind diese Dateitests hochgradig relevant:
-f <Pfad>: Wahr, wenn der Pfad existiert und eine reguläre Datei ist.-d <Pfad>: Wahr, wenn der Pfad ein Verzeichnis ist.-e <Pfad>: Wahr, wenn der Pfad existiert (egal ob Datei, Ordner, Link oder Device).-s <Pfad>: Wahr, wenn die Datei existiert und eine Größe > 0 Bytes hat (nicht leer ist).-L <Pfad>(oder-h): Wahr, wenn der Pfad ein symbolischer Link (Symlink) ist.-r/-w/-x <Pfad>: Wahr, wenn der Pfad für den aktuellen Benutzer lesbar / schreibbar / ausführbar ist.
Wenn ein Skript nicht tut, was es soll:
set -x(oder Aufruf mitbash -x skript.sh): Gibt jeden Befehl vor der Ausführung mit einem führenden+aus (Tracing).set -e: Bricht das Skript sofort ab, wenn ein Fehler auftritt (Exit-Status > 0).exit <wert>: Beendet ein Skript manuell und liefert den Wert an den aufrufenden Prozess (Standard-Exitcodes: 0 = Erfolg, 1-255 = Fehlerwert).
- Argument-Check: Schreibe ein Skript, das prüft, ob genau zwei Argumente übergeben wurden. Falls nicht, gib eine Fehlermeldung aus und beende mit
exit 1. - Case-Menü: Erstelle ein Skript, das die System-Informationen (
uname,uptime,free) basierend auf einer Benutzereingabe ausgibt. - Arithmetic-Loop: Nutze eine
while-Schleife und$(( )), um die Zahlen von 1 bis 10 zu addieren. - Expansion-Trick: Erstelle eine Variable
DATEI="backup_2026.tar.gz". Nutze Parameter-Expansion, um nurbackup_2026auszugeben.
| Keyword / Befehl | Erklärung |
|---|---|
#!/bin/bash |
Shebang: Erste Zeile im Skript, die dem Kernel mitteilt, mit welchem Interpreter das Skript auszuführen ist. |
read -r |
Liest eine Tastatureingabe des Benutzers zeilenweise ein; verhindert die Interpretation von Backslashes. |
if [ ... ] |
Kontrollstruktur zur bedingten Ausführung von Codeblöcken basierend auf Testergebnissen. |
$1, $2 |
Positionsparameter: Repräsentieren das erste, zweite usw. Argument, das dem Skript übergeben wurde. |
exit |
Beendet ein Shell-Skript sofort und gibt einen numerischen Statuscode (0 = Erfolg, 1-255 = Fehler) an den Aufrufer zurück. |
Hier sind typische Fragen rund um Shell Scripting:
Fragen zu Variablen & Parametern (Klicken zum Ausklappen)
-
Was ist der Unterschied zwischen
VAR=Wertundexport VAR=Wert?Antwort
`VAR=Wert` definiert eine lokale Shell-Variable, die nur in der aktuellen Shell-Instanz sichtbar ist. `export VAR=Wert` macht daraus eine Umgebungsvariable (Environment Variable), die auch an alle von dieser Shell gestarteten Programme (Kindprozesse, Subshells) vererbt wird. -
Wie greift man in einem Bash-Skript auf das 11. Argument zu?
Antwort
Ab dem 10. Argument müssen geschweifte Klammern verwendet werden: **`${11}`**. Würde man `$11` schreiben, interpretiert die Bash dies als das erste Argument `$1` gefolgt von einer statischen Ziffer `1`. -
Was ist der Unterschied zwischen
"$*"und"$@"?Antwort
Unter doppelten Anführungszeichen expandiert **`"$*"`** zu einer einzigen Zeichenkette, in der alle Parameter durch das erste Zeichen der IFS-Variable (standardmäßig ein Leerzeichen) getrennt sind (z. B. `"arg1 arg2 arg3"`). **`"$@"`** hingegen expandiert zu einer Liste von separaten Zeichenketten (z. B. `"arg1"` `"arg2"` `"arg3"`), wodurch Leerzeichen in den einzelnen Argumenten erhalten bleiben. Letzteres ist fast immer die sicherere Variante.
Fragen zu Kontrollstrukturen & Debugging (Klicken zum Ausklappen)
-
Wie lautet die Syntax für eine native mathematische Berechnung in der Bash?
Antwort
Berechnungen werden in doppelten runden Klammern mit einem führenden Dollarzeichen ausgeführt: **`$(( 3 + 4 ))`**. Die Bash unterstützt dabei nativ nur Ganzzahlen (Integers). -
Welche nützliche Funktion hat
set -eam Anfang eines Skripts?Antwort
Es sorgt dafür, dass das Skript sofort abgebrochen wird, sobald ein darin aufgerufener Befehl fehlschlägt (also einen Exit-Code ungleich `0` liefert). Dies verhindert Folgeschäden bei Fehlern.
Im Assets-Verzeichnis finden Sie die Unterlagen zu diesem Tag:
Letztes Update: 26. Mai 2026 für den Linux-Essentials Kurs.
- Tag 07 (Archivierung & Software-Builds): ⬅️ Tag 07
- Tag 09 (Reguläre Ausdrücke (Regex)): ➡️ Tag 09
- Master-Repository: 🌌 Zurück zum Master-Repository
Erstellt & gepflegt von Tobias Boyke, Juni 2026.
