Bash - Les arguments (paramètres)

baissaoui Messages postés 497 Date d'inscription jeudi 2 septembre 2021 Statut Webmaster Dernière intervention 22 mars 2024 - 21 juin 2022 à 12:36
Document initial créé par Jipicy

Il est possible de fournir à un script, sur la ligne de commandes, les arguments nécessaires à son exécution. Ces arguments sont appelés "paramètres".
Il en existe deux catégories : les paramètres positionnels et les paramètres spéciaux.


Notre vidéo

"FAQ : Bash - Les paramètres"

Paramètres positionnels

Ce sont tous simplement les arguments passés en "paramètres" sur la ligne de commandes, à l'invocation d'un script. Ils sont alors affectés aux variables réservées 1,2,3,...9,10,11,... et peuvent être appelés à l'aide des expressions
$1
,
$2
...
${10}
,
${11}
...

Note : Le shell Bourne est limité aux paramètres de 0 à 9.

Exemple 1

Voici un petit script qui se contente d'afficher certains des arguments passés en paramètres en fonction de leur position.
#!/bin/bash
# affiche_param.sh

echo "Le 1er paramètre est : $1"
echo "Le 3ème paramètre est : $3"
echo "Le 10ème paramètre est : ${10}"
echo "Le 15ème paramètre est : ${15}"

Il suffit alors d'invoquer le script en lui passant un certain nombre de paramètres :
./affiche_param.sh 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

Le 1er paramètre est : 1
Le 3ème paramètre est : 3
Le 10ème paramètre est : 10
Le 15ème paramètre est : 15
ou encore :
./affiche_param.sh un 2 trois 4 5 6 7 8 9 dix 11 12 13 14 quinze 16 17
Le 1er paramètre est : un
Le 3ème paramètre est : trois
Le 10ème paramètre est : dix
Le 15ème paramètre est : quinze

Si certains paramètres contiennent des caractères spéciaux ou des espaces, il
faut alors les "quoter" :

./affiche_param.sh un 2 "le 3ème" 4 5 6 7 8 9 dix 11 12 13 14 "le 15ème" 16 17
Le 1er paramètre est : un
Le 3ème paramètre est : le 3ème
Le 10ème paramètre est : dix
Le 15ème paramètre est : le 15ème

Les paramètres spéciaux

Ce sont en fait là aussi des variables réservées qui permettent pour certaines d'effectuer des traitements sur les paramètres eux-même.
Ces paramètres sont les suivants :
$0
Contient le nom du script tel qu'il a été invoqué
$*
L'ensembles des paramètres sous la forme d'un seul argument
$@
L'ensemble des arguments, un argument par paramètre
$#
Le nombre de paramètres passés au script
$?
Le code retour de la dernière commande
$$
Le PID su shell qui exécute le script
$!
Le PID du dernier processus lancé en arrière-plan

Exemple 2

Voici un autre petit script mettant en oeuvre l'ensemble des paramètres spéciaux vus ci-dessus.
#!/bin/bash
# affiche_param_2.sh

# Affichage du nom su script
echo "Le nom de mon script est : $0"
# Affichage du nombre de paramètres
echo "Vous avez passé $# paramètres"
# Liste des paramètres (un seul argument)
for param in "$*"
do
 echo "Voici la liste des paramètres (un seul argument) : $param"
done
# Liste des paramètres (un paramètre par argument)
echo "Voici la liste des paramètres (un paramètre par argument) :"
for param in "$@"
do
 echo -e " Paramètre : $param"
done
# Affichage du processus
echo "Le PID du shell qui exécute le script est : $$"
# Exécution d'une commande qui s'exécute en arrière-plan
sleep 100 &
# Affichage du processus lancé en arrière-plan
echo "Le PID de la dernière commande exécutée en arrière-plan est : $!"
# Affichage du code retour de la dernière commande "echo"
echo "Le code retour de la commande précédente est : $?"
# Génération d'une erreur
echo "Génération d'une erreur..."
# Affichage de la mauvaise commande
echo "ls /etc/password 2>/dev/null"
ls /etc/password 2>/dev/null
# Affichage du code retour de la dernière commande
echo "Le code retour de la commande précédente est : $?"
exit
Ce qui donne avec l'invocation suivante :
./affiche_param_2.sh 1 2 3 quatre 5 six

Le nom de mon script est : ./affiche_param_2.sh
Vous avez passé 6 paramètres
Voici la liste des paramètres (un seul argument) : 1 2 3 quatre 5 six
Voici la liste des paramètres (un paramètre par argument) :
Paramètre : 1
Paramètre : 2
Paramètre : 3
Paramètre : quatre
Paramètre : 5
Paramètre : six
Le PID du shell qui exécute le script est : 6165
Le PID de la dernière commande exécutée en arrière-plan est : 6166
Le code retour de la commande précédente est : 0
Génération d'une erreur...
ls /etc/password 2>/dev/null
Le code retour de la commande précédente est : 1

Initialiser des paramètres

- La commande "set" -

Il est possible d'affecter directement des paramètres au shell grâce à la commande
set

Une simple commande tel que :
set param1 param2 param3
initialisera automatiquement les paramètres positionnels
$1
,
$2
,
$3
avec les valeurs
param1
,
param2
,
param3
, effaçant de ce fait les anciennes valeurs si toutefois elles existaient. Les paramètres spéciaux
$#
,
$*
et
$@
sont automatiquement mis à jours en conséquence.

Exemples

$ set param1 param2 param3
$ echo "Nombre de paramètres : $#"
Nombre de paramètres : 3
$ echo "Le second paramètre est : $2"
Le second paramètre est : param2
$ echo "Les paramètres sont : $@"
Les paramètres sont : param1 param2 param3

$ set pêche pomme
$ echo "Nombre de paramètres : $#"
Nombre de paramètres : 2
$ echo "Les paramètres sont : $@"
Les paramètres sont : pêche pomme

Cette fonctionnalité peut s'avérer utile dans le traitement de fichiers ligne
par ligne afin d'isoler chaque mot (champ), et d'en formater la sortie.

$ IFS=":"; set $(grep $USER /etc/passwd)
$ echo -e "Login : $1
Nom : $5
ID : $3
Group : $4
Shell : $7"


Login : jp
Nom : Jean-Philippe
ID : 500
Group : 500
Shell : /bin/bash

- La commande "shift" -

La commande interne
shift
permet quant à elle de décaler les paramètres. La valeur du 1er paramètre (
$1
) est remplacée par la valeur du 2nd paramètre (
$2
), celle du 2nd paramètre (
$2
) par celle du 3ème paramètre (
$3
), etc...
On peut indiquer en argument (
shift [n]
) le nombre de pas (position) dont il faut décaler les paramètres.

Exemple 3

Voilà une mise en oeuvre de l'emploi de la commande interne "shift".
#!/bin/bash
# decale_param.sh

echo
echo "Nombre de paramètres : $#"
echo "Le 1er paramètre est : $1"
echo "Le 3ème paramètre est : $3"
echo "Le 6ème paramètre est : $6"
echo "Le 10ème paramètre est : ${10}"
echo "============================================="
echo "Décalage d'un pas avec la commande "shift""
shift
echo "Nombre de paramètres : $#"
echo "Le 1er paramètre est : $1"
echo "Le 3ème paramètre est : $3"
echo "Le 6ème paramètre est : $6"
echo "Le 10ème paramètre est : ${10}"
echo "============================================="
echo "Décalage de quatre pas avec la commande "shift 4""
shift 4
echo "Nombre de paramètres : $#"
echo "Le 1er paramètre est : $1"
echo "Le 3ème paramètre est : $3"
echo "Le 6ème paramètre est : $6"
echo "Le 10ème paramètre est : ${10}"
echo
Et son résultat :
./decale_param.sh 1 2 3 4 5 6 7 8 9 10

Nombre de paramètres : 10
Le 1er paramètre est : 1
Le 3ème paramètre est : 3
Le 6ème paramètre est : 6
Le 10ème paramètre est : 10
=============================================
Décalage d'un pas avec la commande "shift"
Nombre de paramètres : 9
Le 1er paramètre est : 2
Le 3ème paramètre est : 4
Le 6ème paramètre est : 7
Le 10ème paramètre est :
=============================================
Décalage de quatre pas avec la commande "shift 4"
Nombre de paramètres : 5
Le 1er paramètre est : 6
Le 3ème paramètre est : 8
Le 6ème paramètre est :
Le 10ème paramètre est :