Variables shell

Les variables sont particulièrement utiles pour faciliter l’usage quotidien du shell ; on s’en sert pour modulariser nos commandes et stocker des résultats à exploiter ultérieurement. Il n’est pas nécessaire de procéder à une déclaration en amont de leur usage, et ces derières ne sont pas typées. En outre, il nous est possible d’instancer des variables comme la donnée d’entier, de chaînes de caractères, de tableaux.1

Syntaxe :

FOO=50          # FOO <- 50
FOO="foo bar"   # FOO <- la chaîne de caractère "foo bar"
FOO=(           # FOO <- un tableau de valeurs
    value_1
    value_2
)

Néanmoins, de telles pratiques ne constituent pas un usage abouti. Tout l’intérêt des variables shells, qu’on écrive un long script ou-bien une commande multi-ligne, consiste en le chaînage de variable et la substition de commandes.

Chaînage de variables

Imaginons qu’on veille conditionner un chemin (path), pour laisser à l’utilisateur la possibilité de surchager la la cible, notamment par le biais de la variable FOO :

FOO=value_1                 # À supposer que FOO soit surchargée par une saisie utilisateur lors de l'exécution du script
BAR=/some/content/$FOO      # La valeur de BAR est conditionnée à celle de FOO

Expansion de variables

Si le mot-clé $ permet de référencer une variable, l’utiliser comme précédemment risque de compromettre la cohérence de l’injection de la valeur.

À l’exécution, pour permettre l’interprétation des variables, toute référence incluse en leur sein est résolue. Ainsi, BAR=/some/content/$FOO devient BAR=/some/content/value_1. Nonobstant, c’est omettre deux subtilités :

  1. FOO contient des espaces :

     FOO="my value"
     BAR=/some/content/$FOO 
     ls $BAR

    À l’exécution BAR <- /some/content/my value, et ls $BAR devient ls /some/content/my value. L’interpréteur cherche le fichier /some/content/my et value prend le large ; au risque de faire crasher la commande si cette dernière n’attend, contextuellement, qu’un seul argument. En outre, on intuite les effets de bords possible, surtout si un script dérive sans être échouer au run time.

    Bonne pratique : on encapsule les chaînes de caractères incluant des variables par des guillements afin de préserver l’intégrité structurelle de la chaîne après expansion des variables.

    Le script devient :

    FOO="my value"
    BAR="/some/content/$FOO"
    ls "$BAR"
  2. $FOO est accolée à d’autres caractères :

Substitution de commande

Footnotes

  1. https://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-5.html