IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Introduction à la programmation en Bash


précédentsommairesuivant

III. Substitution de commandes

III-1. Présentation

 
Sélectionnez
Syntaxe :      $( cmd )

Une commande cmd entourée par une paire de parenthèses () précédées d'un caractère $ est exécutée par le shell puis la chaîne $( cmd ) est remplacée par les résultats de la commande cmd écrits sur la sortie standard, c’est à dire l’écran. Ces résultats peuvent alors être affectés à une variable ou bien servir à initialiser des paramètres de position.

 
Sélectionnez
$ pwd
/home/sanchis                      => résultat écrit par pwd sur sa sortie standard
$ repert=$(pwd)                    => la chaîne /home/sanchis remplace la chaîne $(pwd)
$ echo mon repertoire est $repert
mon repertoire est /home/sanchis
$

Exercice 1 :
En utilisant la substitution de commande, écrire un fichier shell mach affichant : "Ma machine courante est nomdelamachine"

 
Sélectionnez
$ mach
Ma machine courante est jade
$

Lorsque la substitution de commande est utilisée avec la commande interne set, l’erreur suivante peut se produire :

 
Sélectionnez
$ set $( ls -l .bashrc)
bash: set: -w: invalid option
set: usage: set [--abefhkmnptuvxBCHP] [-o option] [arg ...]
$ ls -l .bashrc
-rw-r--r-- 1 sanchis users 1342 nov 29 2004 .bashrc
$

Le premier mot issu de la substitution commence par un caractère tiret : la commande interne set l'interprète comme une option, ce qui provoque une erreur. Pour résoudre ce type de problème, on double le caractère tiret.

 
Sélectionnez
$ set -- $(ls -l .bashrc)
$ echo $1
-rw-r--r—
$

Exercice 2 :
Ecrire un programme shell taille qui prend un nom de fichier en argument et affiche sa taille. On ne considère aucun cas d'erreur.
Plusieurs commandes peuvent être présentes entre les parenthèses.

 
Sélectionnez
$ pwd ; whoami
/home/sanchis
sanchis
$ set $(pwd ; whoami)
$ echo $2: $1
sanchis: /home/sanchis
$

Exercice 3 : A l'aide de la commande unix date, écrire un programme shell jour qui affiche le jour courant du mois

 
Sélectionnez
$ date
dimanche 22 octobre 2006, 18:33:38 (UTC+0200)
$ jour
22
$

Exercice 4 :

  • a) Ecrire un programme shell heure1 qui affiche l'heure sous la forme heures:minutes:secondes
 
Sélectionnez
                 Ex : $ heure1
                       18:33:38
                       $
  • b) Ecrire un programme shell heure qui n'affiche que les heures et minutes
 
Sélectionnez
                 Ex : $ heure
                       18:33
                       $

Exercice 5 :
Ecrire un programme shell nbconnect qui affiche le nombre d'utilisateurs connectés sur la machine locale

plusieurs solutions sont possibles :
solution 1, avec who | wc -l
solution 2, avec uptime
solution 3, avec users
solution 4, avec who -q

Les substitutions de commandes peuvent être imbriquées.

 
Sélectionnez
$ ls .gnome
application-info gnome-vfs mime-info
$ set $( ls $(pwd)/.gnome )
$ echo $#                                => nombre d'entrées du répertoire .gnome
3
$

Plusieurs sortes de substitutions (de commandes, de variables) peuvent être présentes dans la même commande.

 
Sélectionnez
$ read rep
gnome
$ set $( ls $( pwd )/$rep )   => substitutions de deux commandes et d'une variable
$

La substitution de commande permet également de capter les résultats écrits par un fichier shell.

 
Sélectionnez
$ jour
22
$ resultat=$( jour )
$

La variable resultat contient la chaîne 22.

Exercice 6 :
Ecrire un programme shell uid qui affiche l'uid de l'utilisateur. On utilisera la commande unix id, la commande interne set et la variable prédéfinie IFS.

Il existe pour la substitution de commande une syntaxe plus ancienne `cmd ` (deux caractères accent grave entourent la commande cmd), à utiliser lorsque se posent des problèmes de portabilité.

III-2. Substitutions de commandes et paramètres régionaux

Créé par des informaticiens américains, le système Unix était originellement destiné à des utilisateurs anglophones. La diffusion des systèmes de la famille Unix (dont GNU/Linux) vers des publics de langues et de cultures différentes a conduit leurs développeurs à introduire des paramètres régionaux (locale). Ces derniers permettent par exemple de fixer la langue d'affichage des messages, le format des dates ou des nombres. Les paramètres régionaux se présentent à l'utilisateur sous la forme de variables prédéfinies dont le nom commence par LC_.

La commande unix locale utilisée sans argument affiche la valeur courante de ces variables d'environnement.

 
Sélectionnez
$ locale
LANG=fr_FR@euro
LC_CTYPE="fr_FR@euro"
LC_NUMERIC="fr_FR@euro"
LC_TIME="fr_FR@euro"
LC_COLLATE="fr_FR@euro"
LC_MONETARY="fr_FR@euro"
LC_MESSAGES="fr_FR@euro"
LC_PAPER="fr_FR@euro"
LC_NAME="fr_FR@euro"
LC_ADDRESS="fr_FR@euro"
LC_TELEPHONE="fr_FR@euro"
LC_MEASUREMENT="fr_FR@euro"
LC_IDENTIFICATION="fr_FR@euro"
LC_ALL=
$

Des commandes telles que date utilisent la valeur de ces variables prédéfinies pour afficher leurs résultats.

 
Sélectionnez
$ date
vendredi 3 novembre 2006, 18:47:02 (UTC+0100)
$

On remarque que le format du résultat correspond bien à une date « à la française » (jour de la semaine, jour du mois, mois, année). Si cette internationalisation procure un confort indéniable lors d'une utilisation interactive du système, elle pose problème lorsque l'on doit écrire un programme shell se basant sur la sortie d'une telle commande, sortie qui dépend étroitement de la valeur des paramètres régionaux. La portabilité du programme shell en est fortement fragilisée.

Cependant, le fonctionnement standard d’un système unix traditionnel peut être obtenu en choisissant la « locale standard » appelée C. Pour que cette locale n’affecte temporairement que les résultats d’une seule commande, par exemple date, il suffit d’exécuter la commande LC_ALL=C date

 
Sélectionnez
$ LC_ALL=C date
Fri Nov 3 18:47:41 CET 2006
$

On s’aperçoit qu’avec la locale standard, le jour du mois est en troisième position alors qu’avec la locale précédente, il était en deuxième position. Pour obtenir de manière portable le jour courant du mois, on pourra exécuter les commandes suivantes :

 
Sélectionnez
$ set $(LC_ALL=C date) ; echo $3
3
$

précédentsommairesuivant

Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.