Les variables

La commande interne set et variables

La commande interne set peut être utilisée de plusieurs manières différentes. Elle peut servir à lister les variables connues du shell à un instant donné. Elle permet également d’affecter des valeurs aux variables 1, 2, …

Lister les variables

La commande set sans paramètres permet d’obtenir une liste classée par ordre alphabétique de l’ensemble des variables avec leurs valeurs.

Affectation de valeurs aux variables 1 2 …

La commande interne set permet d’affecter ses paramètres aux variables 1, 2 etc…

Exemple:

set bonjour a tous
echo $1
bonjour
echo $2
a
echo $3
tous

Cette possibilité est intéressante pour découper en mots le contenu d’une variable. Voici un fichier de commandes qui extrait la deuxième colonne d’un fichier supposé contenir une information organisée en colonnes :

while read ligne
do
set $ligne
echo $2
done

La commande interne readonly

Si on désire protéger des variables de toute affectation ultérieure, on peut les déclarer en lecture seulement avec la commande interne readonly. Invoquer readonly sans paramètre permet d’obtenir la liste de toutes les variables en lecture seulement. Exemple :

V1=1 V2=2
readonly V1 V2
V1=3
V1: is read only
readonly
readonly V1
readonly V2

Les variables affectées par le shell

Les variables affectées automatiquement par le shell sont les suivantes :

      $#                  nombre de paramètres d’un fichier de commandes

      $-                   options courantes du shell

      $?                  valeur retournée par la dernière commande exécutée

      $$                  numéro de processus du shell

      $!                   numéro de processus de la dernière commande exécutée en arrière plan

      $0                           le nom du fichier de commandes

      $0 $1…$9    paramètres d’un fichier de commandes ou affectés par set

      $*                  l’ensemble des paramètres d’un fichier de commandes

      $@                l’ensemble des paramètres d’un fichier de commandes chacun étant protégé par « 

Remarque :  La variable # est pratique pour vérifier la validité de l’appel d’un fichier de commandes.

On donne en exemple le début d’un fichier de commandes qui vérifie qu’on lui passe bien deux paramètres.

#!/bin/sh
if [ $# -ne 2 ]
then
echo "Il faut les parametres ... et ..."
exit 1
fi

On fera attention au fait que # contient le nombre de paramètres, alors qu’en langage C, dans main(arg\c{c}argv), argc contient le nombre de paramètres + 1.

 

 La variable $ est très pratique pour créer des noms de fichiers temporaires desquels on est sûr de l’unicité. On pourra écrire par exemplecommande > /tmp/gestion.$$ . 

Si plusieurs utilisateurs exécutent le fichier de commandes en même temps, on est sûr qu’il n’y aura pas de collision entre les noms des fichiers temporaires.

La variable * est très pratique pour référencer la liste des paramètres sans se préoccuper de leur nombre. Supposons que l’on crée une commande LPRTEX qui a pour but d’appeler lpr avec l’argument –d :

lpr -d $*
# LPRTEX fic1 fic2 fic3

La différence entre * et @ est subtile :

$*        vaut $1 $2 $3 …

« $* »     vaut  » $1 $2 $3 … « 

$@      vaut $1 $2 $3 …

« $@ »   vaut « $1 » « $2 » « $3 » …

Le fichier de commandes suivant (printparams) et son exécution feront comprendre la différence :

#!/bin/sh
echo "*** phase 1 ***"
for i in $*
       do
             echo $i
       done
echo "*** phase 2 ***"
for i in "$*"
       do
             echo $i
       done
echo "*** phase 3 ***"
for i in $@
       do
             echo $i
       done
echo "*** phase 4 ***"
for i in "$@"
       do
             echo $i
       done
> printparams a 'b c'
*** phase 1 ***
a
b
c
*** phase 2 ***
a b c
*** phase 3 ***
a
b
c
*** phase 4 ***
a
b c

La commande interne shift

La commande interne shift a pour effet d’affecter la valeur de $2 à $1, la valeur de $3 à $2, etc… et d’affecter la valeur du dixième paramètre (qui jusque là était inaccessible) à $9. De surcroît, shift met à jour la variable $# en diminuant sa valeur de 1. La commande shift permet donc d’accéder aux paramètres au delà du neuvième. Exemple :

#!/bin/sh
# récupération de 11 paramètres
P1=$1 P2=$2 P3=$3 P4=$4 P5=$5 P6=$6 P7=$7 P8=$8 P9=$9
shift
P10=$9
shift
P11=$9

La commande interne shift est également agréable pour traiter les paramètres optionnels d’un fichier de commandes. Soit le fichier de commandes cmd que l’on peut appeler de deux manières différentes : soit cmd fichier, soit cmd -a fichier. On pourra analyser les paramètres de la manière suivante :

#!/bin/sh
OPTION=
if [ $# -eq 0 ]
then
echo "Usage: cmd [-a] fichier"
exit 1
fi
if [ $1 = -a ]
then
OPTION=a
shift
fi
FICHIER=$1
Print Friendly, PDF & Email