DanLevy.net

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 :

Terminal window
name=Alice

Cette 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 ?

Terminal window
echo c{a,b}t

L’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 cbt

Alors, que va-t-il afficher ?

Terminal window
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 (\\) :

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

Que se passe-t-il ici ?

Terminal window
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 meow

Il 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 :

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

Bien 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 ?

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

Avez‑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 :

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

Remarque : les doubles crochets [[ ]] sont recommandés pour les expressions conditionnelles. Voir BashFAQ.

Comment comparer des chaînes en Bash ?

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

Une 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 ?

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

Les 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 :

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

Comment les mathématiques fonctionnent-elles dans Bash ?

La syntaxe (( )) effectue des calculs entiers dans Bash.

Elle peut être utilisée pour des calculs simples :

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

Ou pour des expressions conditionnelles :

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

Pour 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 ?

Terminal window
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 cat

Pour 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 - !)

Quel n’est PAS ❌ un mot‑clé de boucle en Bash ?

each n’est pas un mot‑clé de boucle en Bash. Les principaux mots‑clés de boucle sont for, while et until.

Bien que do ne soit pas techniquement un mot‑clé de boucle, il fait partie intégrante de la syntaxe des boucles.

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 :

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

La 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 :