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:
name=AliceDies 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?
echo c{a,b}tDie {}-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 cbtWas wird das jetzt ausgeben?
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 (\\):
price="\$100"echo "Cost: $price"Was passiert hier?
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 meowSie 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:
username="@justsml"echo ${#username} # => 8Obwohl 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?
if [ -e cats.txt]; then echo "File exists"else echo "File does not exist"fiHast 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:
if [ -e example.txt ]; then echo "File exists"else echo "File does not exist"fiHinweis: Doppelte eckige Klammern [[ ]] sind empfohlen für Bedingungsausdrücke. Siehe BashFAQ.
Wie kann man Strings in Bash vergleichen?
cat1="Rosie"cat2="Sunflower"if [ "$cat1" === "$cat2" ]; then echo "Same cat"else echo "Different cats"fiEin 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?
function greet () { echo "$1"}greet Hi DanFunktionen 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:
echo "Mr. Levy 👨🏻🔬" | wc -m# => 14Wie funktioniert Mathematik in Bash?
Die (( ))‑Syntax führt Ganzzahl‑Mathematik in Bash aus.
Sie kann für einfache Berechnungen verwendet werden:
((result = 2 + 2))echo $result # => 4Oder für bedingte Ausdrücke:
if (( 2 > 1 )); then echo "2 is greater than 1"fiFür Fließkomma‑Arithmetik solltest du bc oder awk verwenden.
Welches davon multipliziert 10 und 0,5 korrekt und gibt 5 aus?
Was bewirkt das : in diesem Skript?
rosie="Bad cat, good cat"echo ${rosie:9}Die Syntax ${var:offset} extrahiert einen Teilstring, beginnend bei offset. Hier ist die Ausgabe:
good catUm 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 -!)
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:
echo "Today is $(date +%F)"# => Today is 2029-12-31Die 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:
- Bash Guide
- BashFAQ
- ShellCheck
- Bash Academy
- Bash Scripting Tutorial
- Bash Reference Manual
- Bash Hackers Wiki
- Bash Guide for Beginners
- Bash Reference Card