Tutoriels

Comment travailler avec des variables dans Bash

Les variables sont vitales si vous souhaitez écrire des scripts et comprendre ce que le code que vous êtes sur le point de copier-coller à partir du Web fera sur votre ordinateur Linux. Nous allons vous aider à démarrer!

Variables 101

Les variables sont des symboles nommés qui représentent une chaîne ou une valeur numérique. Lorsque vous les utilisez dans des commandes et des expressions, elles sont traitées comme si vous aviez tapé la valeur qu’elles contiennent au lieu du nom de la variable.

Pour créer une variable, il vous suffit de lui fournir un nom et une valeur. Vos noms de variables doivent être descriptifs et vous rappeler la valeur qu’ils détiennent. Un nom de variable ne peut pas commencer par un nombre ni contenir d’espaces. Il peut cependant commencer par un trait de soulignement. En dehors de cela, vous pouvez utiliser n’importe quel mélange de caractères alphanumériques majuscules et minuscules.

Exemples

Ici, nous allons créer cinq variables. Le format consiste à taper le nom, le signe égal = et la valeur. Notez qu’il n’y a pas d’espace avant ou après le signe égal. Donner une valeur à une variable est souvent appelé attribuer une valeur à la variable.

Nous allons créer quatre variables chaîne et une variable numérique, this_year:

me=Dave
my_boost=Linux
him=Popeye
his_boost=Spinach
this_year=2019

À voir la valeur tenu dans une variable, utilisez la commande echo. Vous devez faire précéder le nom de la variable d’un signe dollar $ chaque fois que vous référencez la valeur qu’elle contient, comme indiqué ci-dessous:

echo $my_name
echo $my_boost
echo $this_year

le

Utilisons toutes nos variables à la fois:

echo "$my_boost is to $me as $his_boost is to $him (c) $this_year"

le

Les valeurs des variables remplacent leurs noms. Vous pouvez également modifier les valeurs des variables. Pour attribuer une nouvelle valeur à la variable, my_boost, il vous suffit de répéter ce que vous avez fait lorsque vous avez attribué sa première valeur, comme ceci:

my_boost=Tequila

le

Si vous réexécutez la commande précédente, vous obtenez maintenant un résultat différent:

echo "$my_boost is to $me as $his_boost is to $him (c) $this_year"

L'écho

Ainsi, vous pouvez utiliser la même commande qui fait référence aux mêmes variables et obtenir des résultats différents si vous modifiez les valeurs contenues dans les variables.

Nous parlerons de la citation des variables plus tard. Pour l’instant, voici quelques points à retenir:

Une variable entre guillemets simples ‘est traitée comme une chaîne littérale et non comme une variable.
Les variables entre guillemets »sont traitées comme des variables.
Pour obtenir la valeur détenue dans une variable, vous devez fournir le signe dollar $.
Une variable sans le signe dollar $ fournit uniquement le nom de la variable.

Exemples corrects et incorrects de référencement de variables dans une fenêtre de terminal.

Vous pouvez également créer une variable qui prend sa valeur à partir d’une variable existante ou d’un nombre de variables. La commande suivante définit une nouvelle variable appelée drink_of_the_Year et lui affecte les valeurs combinées des variables my_boost et this_year:

drink_of-the_Year="$my_boost $this_year"
echo drink_of_the-Year

Le drink_of-the_Year =

Comment utiliser des variables dans des scripts

Les scripts seraient complètement bloqués sans variables. Les variables offrent la flexibilité qui fait d’un script une solution générale plutôt qu’une solution spécifique. Pour illustrer la différence, voici un script qui compte les fichiers dans le répertoire / dev.

  Voici ce qui l'a rendu spécial

Tapez-le dans un fichier texte, puis enregistrez-le sous fcnt.sh (pour «nombre de fichiers»):

#!/bin/bash

folder_to_count=/dev

file_count=$(ls $folder_to_count | wc -l)

echo $file_count files in $folder_to_count

Avant de pouvoir exécuter le script, vous devez le rendre exécutable, comme indiqué ci-dessous:

chmod +x fcnt.sh

Tapez ce qui suit pour exécuter le script:

./fcnt.sh

Cela imprime le nombre de fichiers dans le répertoire / dev. Voici comment ça fonctionne:

Une variable appelée folder_to_count est définie et elle est définie pour contenir la chaîne «/ dev».
Une autre variable, appelée file_count, est définie. Cette variable prend sa valeur d’une substitution de commande. C’est la phrase de commande entre les parenthèses $ (). Notez qu’il y a un signe dollar $ avant la première parenthèse. Cette construction $ () évalue les commandes entre parenthèses, puis renvoie leur valeur finale. Dans cet exemple, cette valeur est affectée à la variable file_count. En ce qui concerne la variable file_count, elle a passé une valeur à hold; il ne s’agit pas de la manière dont la valeur a été obtenue.
La commande évaluée dans la substitution de commande exécute une liste de fichiers ls sur le répertoire de la variable folder_to_count, qui a été définie sur «/ dev». Ainsi, le script exécute la commande «ls / dev».
La sortie de cette commande est dirigée vers la commande wc. L’option -l (nombre de lignes) fait que wc compter le nombre de lignes dans la sortie de la commande ls. Comme chaque fichier est répertorié sur une ligne distincte, il s’agit du nombre de fichiers et de sous-répertoires dans le répertoire «/ dev». Cette valeur est affectée à la variable file_count.
La dernière ligne utilise l’écho pour afficher le résultat.

Mais cela ne fonctionne que pour le répertoire «/ dev». Comment pouvons-nous faire fonctionner le script avec n’importe quel répertoire? Tout ce qu’il faut, c’est un petit changement.

Comment utiliser les paramètres de ligne de commande dans les scripts

De nombreuses commandes, telles que ls et wc, prennent des paramètres de ligne de commande. Ceux-ci fournissent des informations à la commande, afin qu’elle sache ce que vous voulez qu’elle fasse. Si vous voulez que ls fonctionne sur votre répertoire personnel et également pour afficher les fichiers cachés, vous pouvez utiliser la commande suivante, où le tilde ~ et l’option -a (all) sont des paramètres de ligne de commande:

ls ~ -a

Nos scripts peuvent accepter des paramètres de ligne de commande. Ils sont référencés comme $ 1 pour le premier paramètre, $ 2 comme deuxième, et ainsi de suite, jusqu’à 9 $ pour le neuvième paramètre. (En fait, il y a aussi un $ 0, mais il est réservé pour toujours contenir le script.)

Vous pouvez référencer des paramètres de ligne de commande dans un script comme vous le feriez pour des variables régulières. Modifions notre script, comme indiqué ci-dessous, et sauvegardons-le sous le nouveau nom fcnt2.sh:

#!/bin/bash

folder_to_count=$1

file_count=$(ls $folder_to_count | wc -l)

echo $file_count files in $folder_to_count

Cette fois, la variable folder_to_count reçoit la valeur du premier paramètre de ligne de commande, $ 1.

  Comment utiliser la commande which sous Linux

Le reste du script fonctionne exactement comme avant. Plutôt qu’une solution spécifique, votre script est désormais une solution générale. Vous pouvez l’utiliser sur n’importe quel répertoire car il n’est pas codé en dur pour fonctionner uniquement avec «/ dev».

Voici comment rendre le script exécutable:

chmod +x fcnt2.sh

Maintenant, essayez-le avec quelques répertoires. Vous pouvez d’abord faire «/ dev» pour vous assurer d’obtenir le même résultat qu’avant. Tapez ce qui suit:

./fnct2.sh /dev
./fnct2.sh /etc
./fnct2.sh /bin

Vous obtenez le même résultat (207 fichiers) que précédemment pour le répertoire «/ dev». Ceci est encourageant et vous obtenez des résultats spécifiques au répertoire pour chacun des autres paramètres de ligne de commande.

Pour raccourcir le script, vous pouvez vous passer de la variable, folder_to_count, et référencer simplement $ 1 partout, comme suit:

#!/bin/bash 

file_count=$(ls $1  wc -l) 

echo $file_count files in $1

Travailler avec des variables spéciales

Nous avons mentionné $ 0, qui est toujours défini sur le nom de fichier du script. Cela vous permet d’utiliser le script pour faire des choses comme imprimer correctement son nom, même s’il est renommé. Ceci est utile dans les situations de journalisation, dans lesquelles vous souhaitez connaître le nom du processus qui a ajouté une entrée.

Voici les autres variables prédéfinies spéciales:

$ #: Combien de paramètres de ligne de commande ont été passés au script.
$ @: Tous les paramètres de ligne de commande passés au script.
$?: Le statut de sortie du dernier processus à exécuter.
$$: ID de processus (PID) du script actuel.
$ USER: Le nom d’utilisateur de l’utilisateur exécutant le script.
$ HOSTNAME: Le nom d’hôte de l’ordinateur exécutant le script.
$ SECONDS: le nombre de secondes pendant lesquelles le script a été exécuté.
$ RANDOM: renvoie un nombre aléatoire.
$ LINENO: renvoie le numéro de ligne actuel du script.

Vous voulez tous les voir dans un seul script, n’est-ce pas? Vous pouvez! Enregistrez ce qui suit sous forme de fichier texte appelé special.sh:

#!/bin/bash

echo "There were $# command line parameters"
echo "They are: $@"
echo "Parameter 1 is: $1"
echo "The script is called: $0"
# any old process so that we can report on the exit status
pwd
echo "pwd returned $?"
echo "This script has Process ID $$"
echo "The script was started by $USER"
echo "It is running on $HOSTNAME"
sleep 3
echo "It has been running for $SECONDS seconds"
echo "Random number: $RANDOM"
echo "This is line number $LINENO of the script"

Tapez ce qui suit pour le rendre exécutable:

chmod +x special.sh

Maintenant, vous pouvez l’exécuter avec un tas de paramètres de ligne de commande différents, comme indiqué ci-dessous.

Variables d’environnement

Bash utilise des variables d’environnement pour définir et enregistrer les propriétés de l’environnement qu’il crée lors de son lancement. Celles-ci contiennent des informations auxquelles Bash peut facilement accéder, telles que votre nom d’utilisateur, vos paramètres régionaux, le nombre de commandes que votre fichier d’historique peut contenir, votre éditeur par défaut, et bien plus encore.

Pour voir les variables d’environnement actives dans votre session Bash, utilisez cette commande:

env | less

le

Si vous faites défiler la liste, vous en trouverez peut-être qu’il serait utile de référencer dans vos scripts.

Une liste de variables d'environnement actives dans une fenêtre de terminal.

Comment exporter des variables

Lorsqu’un script s’exécute, il fait partie de son propre processus et les variables qu’il utilise ne peuvent pas être vues en dehors de ce processus. Si vous souhaitez partager une variable avec un autre script que votre script lance, vous devez exporter cette variable. Nous allons vous montrer comment procéder avec deux scripts.

  Comment configurer Mattermost sur Linux

Tout d’abord, enregistrez les éléments suivants sous le nom de fichier script_one.sh:

#!/bin/bash

first_var=alpha
second_var=bravo

# check their values
echo "$0: first_var=$first_var, second_var=$second_var"

export first_var
export second_var

./script_two.sh

# check their values again
echo "$0: first_var=$first_var, second_var=$second_var"

Cela crée deux variables, first_var et second_var, et affecte certaines valeurs. Il les imprime dans la fenêtre du terminal, exporte les variables et appelle script_two.sh. Lorsque script_two.sh se termine et que le flux de processus revient à ce script, il imprime à nouveau les variables dans la fenêtre du terminal. Ensuite, vous pouvez voir s’ils ont changé.

Le deuxième script que nous utiliserons est script_two.sh. C’est le script que script_one.shcalls. Tapez ce qui suit:

#!/bin/bash

# check their values
echo "$0: first_var=$first_var, second_var=$second_var"

# set new values
first_var=charlie
second_var=delta

# check their values again
echo "$0: first_var=$first_var, second_var=$second_var"

Ce second script imprime les valeurs des deux variables, leur attribue de nouvelles valeurs, puis les imprime à nouveau.

Pour exécuter ces scripts, vous devez taper ce qui suit pour les rendre exécutables:

chmod +x script_one.sh
chmod +x script_two.sh

Et maintenant, tapez ce qui suit pour lancer script_one.sh:

./script_one.sh

Voici ce que nous dit la sortie:

script_one.sh imprime les valeurs des variables, qui sont alpha et bravo.
script_two.sh imprime les valeurs des variables (alpha et bravo) telles qu’il les a reçues.
script_two.sh les change en charlie et delta.
script_one.sh imprime les valeurs des variables, qui sont toujours alpha et bravo.

Ce qui se passe dans le second script reste dans le second script. C’est comme si des copies des variables étaient envoyées au deuxième script, mais elles sont supprimées lorsque ce script se termine. Les variables d’origine dans le premier script ne sont pas modifiées par quoi que ce soit qui arrive à leurs copies dans le second.

Comment citer des variables

Vous avez peut-être remarqué que lorsque les scripts font référence à des variables, elles sont entre guillemets ». Cela permet aux variables d’être référencées correctement, de sorte que leurs valeurs sont utilisées lorsque la ligne est exécutée dans le script.

Si la valeur que vous affectez à une variable comprend des espaces, ils doivent être entre guillemets lorsque vous les affectez à la variable. C’est parce que, par défaut, Bash utilise un espace comme délimiteur.

Voici un exemple:

site_name=toptips.fr

Bash voit l’espace avant «Geek» comme une indication qu’une nouvelle commande commence. Il signale qu’une telle commande n’existe pas et abandonne la ligne. echo nous montre que la variable site_name ne contient rien – pas même le texte «How-To».

Essayez à nouveau avec des guillemets autour de la valeur, comme indiqué ci-dessous:

site_name="toptips.fr"

site_name =

Cette fois, il est reconnu comme une valeur unique et attribué correctement à la variable site_name.

echo est votre ami

Cela peut prendre un certain temps pour s’habituer à la substitution de commandes, citer des variables et se rappeler quand inclure le signe dollar.

Avant d’appuyer sur Entrée et d’exécuter une ligne de commandes Bash, essayez-le avec l’écho devant lui. De cette façon, vous pouvez vous assurer que ce qui va se passer est ce que vous voulez. Vous pouvez également détecter les erreurs que vous avez pu commettre dans la syntaxe.

x