Quiz : Maîtrise de Bash et du Shell
Vous parlez aux ordinateurs ? Enfin, comment ?
Mettez vos compétences en script Bash à l’épreuve avec ces 16 questions !
Couvrant les variables, les boucles, les conditions, la manipulation de chaînes, les fonctions et les pièges syntaxiques du simple au complexe.
Affûtez (ou prouvez) vos compétences en scripting shell !
Comment les variables sont‑elles définies dans Bash ?
Les variables dans Bash sont déclarées sans espaces autour du signe =. Par exemple :
name=AliceCette assignation donne la valeur "Alice" à la variable name.
Note : $name est utilisé pour référencer ou lire la valeur d’une variable.
Ajouter des espaces fait que le shell interprète la commande comme un programme à exécuter, ce qui n’est pas souhaité lors de l’affectation d’une variable.
De plus, Bash est sensible à la casse, donc name, NAME et Name sont des variables différentes.
Enfin, les noms de variables ne peuvent pas contenir d’espaces ni de tirets (-). Utilisez des underscores (_) ou le camelCase à la place.
Quel affichera It's 🔨 Time! ?
Je sais. C’est fou à quel point l’échappement rend les chaînes difficiles à analyser. Imaginez devoir échapper d’autres langages dans des chaînes Bash – avec toutes ces guillemets, apostrophes et symboles $ qui vous font chier. 🫠
Les guillemets simples doivent être échappés à l’intérieur des chaînes entre guillemets simples. La séquence fermeture‑guillemet, guillemet‑échappé, réouverture ('\'') permet d’afficher :
It's 🔨 Time!Il existe d’autres façons de faire, mais c’est la plus courante.
Quelle sera la sortie de cette commande ?
echo c{a,b}tL’expansion entre accolades {} génère plusieurs versions du contexte de chaîne, une (ou plusieurs) pour chaque valeur séparée par des virgules ou chaque motif.
Ici, c{a,b}t s’étend en :
cat cbtAlors, que va-t-il afficher ?
price="$100"echo "Cost: $price"Les variables numérotées ont une signification spéciale. Dans ce cas, $1 est une variable spéciale qui contient le premier argument passé au script ou à la fonction.
Comme nous exécutons le script dans un REPL, il n’y a aucun argument, donc $1 est vide. Le texte restant 00 est affiché tel quel.
Pour afficher un caractère $ littéral, utilisez des guillemets simples ou échappez‑le avec un antislash (\\) :
price="\$100"echo "Cost: $price"Que se passe-t-il ici ?
str="Bark bark"echo ${str/bark/meow}La syntaxe ${var/pattern/replacement} remplace la première occurrence de pattern par replacement. Ici, la sortie est :
Bark meowIl est sensible à la casse. Pour gérer à la fois bark et Bark, utilisez un motif tel que ${var/[Bb]ark/Bark} ou normalisez la chaîne avant le remplacement.
Pour remplacer toutes les occurrences, utilisez ${var//pattern/replacement}.
Pour remplacer depuis le début de la chaîne, utilisez ${var/#pattern/replacement}.
Pour remplacer depuis la fin de la chaîne, utilisez ${var/%pattern/replacement}.
Comment obtenir la longueur d’une variable en Bash ?
La syntaxe ${#username} renvoie la longueur de username.
Par exemple :
username="@justsml"echo ${#username} # => 8Bien que wc fonctionnerait, ce n’est techniquement pas une partie de Bash.
L’utilitaire wc est une vieille blague interne faisant référence à “water closet”, ou toilettes.
PLAISANTERIE ! Quelqu’un lit encore ça ?
En réalité, wc est une commande ancienne du POSIX (et des jours Unix d’AT&T). Son nom signifie “word count” et il peut compter les lignes, les mots et les caractères dans un fichier ou un flux d’entrée.
Que produit ce script si le fichier cats.txt EXISTE ?
if [ -e cats.txt]; then echo "File exists"else echo "File does not exist"fiAvez‑vous remarqué l’espace manquant avant la parenthèse fermante ?
Bash est assez pointilleux ici : des espaces sont requis à l’intérieur des expressions entre crochets.
Parce que l’espace manquant fait que la commande [ ne voit pas de ] de fermeture, Bash affiche un diagnostic, considère le test comme échoué et passe à la branche else.
La syntaxe correcte est :
if [ -e example.txt ]; then echo "File exists"else echo "File does not exist"fiRemarque : les doubles crochets [[ ]] sont recommandés pour les expressions conditionnelles. Voir BashFAQ.
Comment comparer des chaînes en Bash ?
cat1="Rosie"cat2="Sunflower"if [ "$cat1" === "$cat2" ]; then echo "Same cat"else echo "Different cats"fiUne autre erreur de syntaxe de test !
Avez‑vous remarqué l’opérateur invalide === ?
Vous pensiez peut‑être à JavaScript…
Avec [ ... ], Bash signale un diagnostic et la condition est fausse, donc la branche else affiche Different cats. En Bash, utilisez = ou == pour les comparaisons d’égalité.
Quelle sera la sortie de ce script ?
function greet () { echo "$1"}greet Hi DanLes fonctions Bash peuvent accepter des arguments. La variable $1 contient le premier argument passé à la fonction.
Rappelez‑vous, $0 est le nom du script, $1 le premier argument, $2 le deuxième, etc. Les espaces séparent les arguments. Ainsi, greet Hi Dan passe "Hi" comme premier argument. Pour passer "Hi Dan" comme un seul argument, il faut le citer : greet "Hi Dan".
Quel opérateur relie la sortie d’une commande à l’entrée de la commande suivante ?
L’opérateur | pipe relie la sortie d’une commande à l’entrée d’une autre. Par exemple :
echo "Mr. Levy 👨🏻🔬" | wc -m# => 14Comment les mathématiques fonctionnent-elles dans Bash ?
La syntaxe (( )) effectue des calculs entiers dans Bash.
Elle peut être utilisée pour des calculs simples :
((result = 2 + 2))echo $result # => 4Ou pour des expressions conditionnelles :
if (( 2 > 1 )); then echo "2 is greater than 1"fiPour l’arithmétique à virgule flottante, envisagez d’utiliser bc ou awk.
Lequel de ces choix multiplie correctement 10 et 0,5 et affiche 5 ?
La syntaxe (( )) effectue UNIQUEMENT des opérations arithmétiques entières. Vous savez, des nombres entiers, sans virgule flottante !
Bash (sans surprise) ne possède pas de support intégré pour l’arithmétique à virgule flottante.
La solution la plus courante consiste à utiliser les utilitaires GNU bc ou awk.
Que fait le : dans ce script ?
rosie="Bad cat, good cat"echo ${rosie:9}La syntaxe ${var:offset} extrait une sous‑chaîne à partir de offset. Ici, la sortie est :
good catPour extraire une sous‑chaîne d’une longueur spécifique, utilisez ${var:offset:length}.
Pour extraire depuis la fin de la chaîne, utilisez ${var: -offset}. (Notez l’espace avant le - !)
Quelle option exécutera la commande ls -l et renverra la sortie ?
La syntaxe $(ls -l) exécute la commande à l’intérieur des parenthèses et substitue la sortie. Par exemple :
echo "Today is $(date +%F)"# => Today is 2029-12-31La première option utilise des guillemets simples ', pas des backticks. Cela empêche l’expansion, donc '$(date +%F)' afficherait simplement la chaîne littérale $(date +%F).
Quel opérateur est utilisé pour combiner la sortie d’erreur avec la sortie standard ?
L’opérateur 2>&1 redirige l’erreur standard (descripteur de fichier 2) vers la sortie standard (descripteur de fichier 1). Cela permet de capturer les messages d’erreur dans le même flux de sortie que la sortie normale.
Mon quiz Bash vous a-t-il laissé en miettes ?
Faites-le moi savoir dans les commentaires ci‑dessous !
Lectures complémentaires
Rafraîchissez vos compétences Bash avec les ressources suivantes :
- Bash Guide
- BashFAQ
- ShellCheck
- Bash Academy
- Bash Scripting Tutorial
- Bash Reference Manual
- Bash Hackers Wiki
- Bash Guide for Beginners
- Bash Reference Card