DanLevy.net

Quiz: Bash‑ und Shell‑Meisterschaft

Kannst du mit Computern reden? So etwa?

Testen Sie Ihre Bash‑Skript‑Kenntnisse mit diesen 16 Fragen!

Variablen, Schleifen, Bedingungen, Zeichenkettenmanipulation, Funktionen und von einfach bis knifflig auftretende Syntax‑Fallstricke.

Schärfen (oder beweisen) Sie Ihre Shell‑Skript‑Fähigkeiten!

Wie werden Variablen in Bash definiert?

Variablen in Bash werden ohne Leerzeichen um das =‑Zeichen deklariert. Zum Beispiel:

Terminal window
name=Alice

Dies weist der Variable name den Wert "Alice" zu.

Hinweis: $name wird verwendet, um den Wert einer Variable referenzieren oder zu lesen.

Leerzeichen führen dazu, dass die Shell den Befehl als auszuführendes Programm interpretiert, was beim Setzen einer Variable nicht gewünscht ist.

Außerdem ist Bash case‑sensitive, daher sind name, NAME und Name unterschiedliche Variablen.

Schließlich dürfen Variablennamen keine Leerzeichen oder Bindestriche (-) enthalten. Verwenden Sie Unterstriche (_) oder camelCase stattdessen.

Was wird It's 🔨 Time! ausgeben?

Ich weiß. Es ist verrückt, wie schnell Escaping Strings schwer lesbar macht. Stell dir vor, du musst andere Sprachen in Bash-Strings escapen – mit all den Anführungszeichen, Apostrophen und $‑Symbolen, die dich verarschen. 🫠

Einzelne Anführungszeichen müssen innerhalb von einfach‑gequoteten Strings escaped werden. Die Sequenz Schließen‑Quote, escaped‑Quote, Wieder‑öffnen‑Quote ('\'') ermöglicht die Ausgabe von:

It's 🔨 Time!

Es gibt andere Wege, das zu lösen, aber das ist der gängigste.

Was gibt dieser Befehl aus?

Terminal window
echo c{a,b}t

Die {}-Klammererweiterung erzeugt mehrere Varianten ihres Zeichenkettenkontexts, jeweils eine (oder mehrere) für jeden kommagetrennten Wert oder jedes Muster.

Hier expandiert c{a,b}t zu:

cat cbt

Was wird das jetzt ausgeben?

Terminal window
price="$100"
echo "Cost: $price"

Nummerierte Variablen haben eine besondere Bedeutung. In diesem Fall ist $1 eine Spezialvariable, die das erste an das Skript oder die Funktion übergebene Argument enthält.

Da wir das Skript in einem REPL ausführen, gibt es keine Argumente, sodass $1 leer ist. Der restliche Text 00 wird unverändert ausgegeben.

Um ein wörtliches $‑Zeichen auszugeben, verwendet man einfache Anführungszeichen oder escaped es mit einem Backslash (\\):

Terminal window
price="\$100"
echo "Cost: $price"

Was passiert hier?

Terminal window
str="Bark bark"
echo ${str/bark/meow}

Die Syntax ${var/pattern/replacement} ersetzt das erste Vorkommen von pattern durch replacement. Hier ist die Ausgabe:

Bark meow

Sie ist case-sensitive. Um sowohl bark als auch Bark zu behandeln, verwende ein Muster wie ${var/[Bb]ark/Bark} oder normalisiere den String vor dem Ersetzen.

Um alle Vorkommen zu ersetzen, verwende ${var//pattern/replacement}.

Um ab Anfang des Strings zu ersetzen, verwende ${var/#pattern/replacement}.

Um vom Ende des Strings zu ersetzen, verwende ${var/%pattern/replacement}.

Wie kann man die Länge einer Variable in Bash erhalten?

Die ${#username}‑Syntax gibt die Länge von username zurück.

Zum Beispiel:

Terminal window
username="@justsml"
echo ${#username} # => 8

Obwohl wc funktionieren würde, ist es technisch gesehen kein Teil von Bash.

Das Dienstprogramm wc ist ein alter Insider‑Witz, der sich auf „water closet“ bzw. Toilette bezieht. SPASS BEISEITE! Liest das überhaupt jemand?

In Wirklichkeit ist wc ein uralter Befehl aus POSIX (und den AT&T‑Unix‑Tagen). Es ist die Abkürzung für „word count“ und kann Zeilen, Wörter und Zeichen in einer Datei oder einem Eingabestrom zählen.

Was gibt dieses Skript aus, wenn die Datei cats.txt EXISTIERT?

Terminal window
if [ -e cats.txt]; then
echo "File exists"
else
echo "File does not exist"
fi

Hast du das fehlende Leerzeichen vor der schließenden Klammer bemerkt?

Bash ist hier ziemlich pingelig: In Klammerausdrücken sind Leerzeichen erforderlich.

Da das fehlende Leerzeichen den [‑Befehl kein schließendes ] sehen lässt, gibt Bash eine Diagnose aus, behandelt den Test als fehlgeschlagen und springt zum else‑Zweig.

Die korrekte Syntax ist:

Terminal window
if [ -e example.txt ]; then
echo "File exists"
else
echo "File does not exist"
fi

Hinweis: Doppelte eckige Klammern [[ ]] sind empfohlen für Bedingungsausdrücke. Siehe BashFAQ.

Wie kann man Strings in Bash vergleichen?

Terminal window
cat1="Rosie"
cat2="Sunflower"
if [ "$cat1" === "$cat2" ]; then
echo "Same cat"
else
echo "Different cats"
fi

Ein weiterer Test‑Syntaxfehler!

Hast du den ungültigen ===‑Operator bemerkt?

Vielleicht hast du an JavaScript gedacht…

Mit [ ... ] gibt Bash eine Diagnose aus und die Bedingung ist falsch, sodass der else‑Zweig Different cats ausgibt. In Bash verwendet man = oder == für Gleichheitsvergleiche.

Was gibt dieses Skript aus?

Terminal window
function greet () {
echo "$1"
}
greet Hi Dan

Funktionen in Bash können Argumente entgegennehmen. Die Variable $1 enthält das erste an die Funktion übergebene Argument.

Denke daran, $0 ist der Skriptname, $1 das erste Argument, $2 das zweite usw. Leerzeichen trennen Argumente. Also übergibt greet Hi Dan "Hi" als erstes Argument. Um "Hi Dan" als ein einziges Argument zu übergeben, muss man es quoten: greet "Hi Dan".

Welcher Operator verbindet die Ausgabe eines Befehls mit der Eingabe des nächsten Befehls?

Der | Pipe-Operator verbindet die Ausgabe eines Befehls mit der Eingabe eines anderen. Zum Beispiel:

Terminal window
echo "Mr. Levy 👨🏻‍🔬" | wc -m
# => 14

Wie funktioniert Mathematik in Bash?

Die (( ))‑Syntax führt Ganzzahl‑Mathematik in Bash aus.

Sie kann für einfache Berechnungen verwendet werden:

Terminal window
((result = 2 + 2))
echo $result # => 4

Oder für bedingte Ausdrücke:

Terminal window
if (( 2 > 1 )); then
echo "2 is greater than 1"
fi

Für Fließkomma‑Arithmetik solltest du bc oder awk verwenden.

Welches davon multipliziert 10 und 0,5 korrekt und gibt 5 aus?

Die (( ))‑Syntax führt NUR Ganzzahl‑Arithmetik aus. Also ganze Zahlen, ohne Gleitkomma!

Bash (vielleicht überraschend) hat keine eingebaute Unterstützung für Gleitkomma‑Arithmetik.

Die gängigste Lösung ist die Verwendung der GNU‑Werkzeuge bc oder awk.

Was bewirkt das : in diesem Skript?

Terminal window
rosie="Bad cat, good cat"
echo ${rosie:9}

Die Syntax ${var:offset} extrahiert einen Teilstring, beginnend bei offset. Hier ist die Ausgabe:

good cat

Um einen Teilstring mit einer bestimmten Länge zu extrahieren, verwende ${var:offset:length}.

Um vom Ende der Zeichenkette zu extrahieren, verwende ${var: -offset}. (Beachte das Leerzeichen vor dem -!)

Was ist KEIN ❌ Schlüsselwort für Schleifen in Bash?

each ist kein Schleifen‑Schlüsselwort in Bash. Die wichtigsten Schleifen‑Schlüsselwörter sind for, while und until.

Obwohl do technisch gesehen kein Schleifen‑Schlüsselwort ist, ist es ein wesentlicher Teil der Schleifensyntax.

Welche Option führt den Befehl ls -l aus und gibt die Ausgabe zurück?

Die Syntax $(ls -l) führt den Befehl innerhalb der Klammern aus und ersetzt ihn durch die Ausgabe. Zum Beispiel:

Terminal window
echo "Today is $(date +%F)"
# => Today is 2029-12-31

Die erste Option verwendet einfache Anführungszeichen ', keine Backticks. Das verhindert die Expansion, sodass '$(date +%F)' einfach die wörtliche Zeichenkette $(date +%F) ausgeben würde.

Obwohl die Verwendung von Backticks (`ls -l`) zur Befehlsausführung noch unterstützt wird, gilt das inzwischen in vielen Kontexten als Anti‑Pattern. Die meisten empfehlen $(command) für bessere Lesbarkeit und Konsistenz über verschiedene Shells und Versionen hinweg.

Geschweifte Klammern ${} dienen der Variablenexpansion, nicht der Befehlsersetzung.

Das %‑Zeichen wird nicht für Befehlsersetzung verwendet.

Welcher Operator wird verwendet, um die Fehlermeldungsausgabe mit der Standardausgabe zu kombinieren?

Der Operator 2>&1 leitet die Standardfehlerausgabe (Dateideskriptor 2) zur Standardausgabe (Dateideskriptor 1) um. Das ist nützlich, um Fehlermeldungen im selben Ausgabestrom wie die reguläre Ausgabe zu erfassen.

Hat mein Bash‑Quiz dich in die Knie gezwungen?

Lass es mich in den Kommentaren unten wissen!

Weiterführende Literatur

Frische deine Bash‑Kenntnisse mit den folgenden Ressourcen auf: