Bash : guillemets et expansions

L'ordre des expansions du shell, les trois protections, le découpage en mots, les formes ${v:-d}, ${v%m} et ${v##m} et le document en ligne : prévoir les arguments que reçoit une commande.

  • 28 cartes
  • 5 thèmes
  • Gratuit

Le programme, thème par thème

Le poids de chaque thème suit celui que lui donne l'examen.

  1. Notions
  2. Questions
  3. Ranger et relier
  4. Mises en situation
  5. Comprendre

Quelques cartes du deck

  • Expansion : de quoi s'agit-il ?

    Voir la réponse

    Transformation que le shell applique à la ligne de commande avant de lancer le programme : accolades, tilde, variables, commandes, calcul, découpage en mots, jokers.

    Le programme ne voit jamais * ni $HOME : il reçoit le résultat. Ce n'est pas ls qui remplace *.txt, c'est le shell, avant d'appeler ls.

  • Qu'affiche ce script ?

    ```bash
    f="mon rapport.txt"
    set -- $f "$f"
    echo $#
    `

    • 3
    • 2
    • 1
    • 4
    Voir la réponse

    3

    $f sans guillemets est coupé en deux mots (mon et rapport.txt), "$f" n'en fait qu'un : 2 + 1 = 3 arguments.

  • Parmi les expansions, le shell traite d'abord les …, puis le tilde et les variables, ensuite le …, et enfin les jokers.

    Voir la réponse

    Parmi les expansions, le shell traite d'abord les accolades, puis le tilde et les variables, ensuite le découpage en mots, et enfin les jokers.

    echo {a,b}{1,2} donne a1 a2 b1 b2 : les accolades sont développées avant tout le reste, même avant les variables. Les jokers viennent en dernier, sur les mots déjà découpés.

  • Protection : de quoi s'agit-il ?

    Voir la réponse

    Marque qui retire à un caractère son sens spécial pour le shell : guillemets simples, guillemets doubles ou barre oblique inverse.

    Les guillemets simples empêchent toute expansion ; les doubles laissent passer $ et \ ; la barre oblique protège le seul caractère suivant.

  • Un script de nettoyage lance rm $fichier avec fichier="mon fichier" et affiche rm: cannot remove 'mon': No such file or directory puis rm: cannot remove 'fichier': No such file or directory. Quelle correction est juste ?

    • rm '$fichier'
    • rm -f $fichier
    • rm "$fichier"
    • rm ${fichier}
    Voir la réponse

    rm "$fichier"

    Les guillemets doubles gardent le contenu de la variable en un seul argument. Les simples empêcheraient l'expansion (rm recevrait le texte $fichier), -f n'ajoute qu'un silence sur les erreurs, et les accolades ne protègent rien du découpage.