Programmation Bash/Scripts
Définition |
Un script est une suite d’instructions, de commandes qui constituent un scénario d'actions. C’est un fichier texte que l’on peut exécuter, c’est à dire, lancer comme une commande. |
Dans la pratique, on utilise plusieurs invites de commandes pour commander des systèmes ou des applications différentes. Par exemple, il est possible d’utiliser Perl, Python, Bash, Tcsh. Il ne suffit donc pas d'écrire une suite d’instructions pour que le système puisse l'exécuter. Il faut également préciser l’interprète pour lequel ce script est écrit. C’est l’objet de la première ligne d’un script : la ligne ”shebang”. Pour un script en shell bash, elle se présente ainsi :
#!/bin/bash
Pour utiliser tcsh, alors il faut écrire :
#!/bin/tcsh
Exécution d'un script
modifierAvant toute chose, il faut rendre un script exécutable. Sous Unix, il s'agit d'utiliser la commande chmod
.
$ chmod +x script.sh $ ls -l -rwxr-xr-x 1 shadouser shadogroup 26 Mar 5 15:31 script.sh
Quatre solutions sont possibles pour exécuter un script.
En utilisant ./ si l'on se trouve dans le répertoire du script :
$ ./script.sh
ou en spécifiant le chemin absolu :
$ /home/jojo/script.sh
si script se trouve dans le répertoire /home/jojo
.
Une autre solution est de modifier la variable d'environnement PATH
et d'y faire figurer le répertoire qui contient le script à exécuter. Dans ce cas, il est possible d'invoquer le script depuis n'importe quel endroit du système de fichiers.
$ PATH=$PATH:/home/jojo/ $ script.sh
Enfin, une dernière solution est d'appeler directement l'interprète et de lui transmettre le script à exécuter.
$ bash script.sh
Exemple de script
modifier#!/bin/bash
for FILE in $*
do
if [ -e $FILE ]
then
echo "Le fichier $FILE est présent dans le répertoire courant."
fi
done
exit 0
Paramètres
modifierLes paramètres fournis par l'utilisateur lors de l'appel de scripts sont accessibles grace aux paramètres positionnels : $0, $1, ..., $9. $0 représente le nom du script tel qu'il a été appelé, $1 est le premier argument du script, $2 le deuxième, etc. Il n'est pas possible d'accéder directement au dixième et suivant arguments de cette manière.
Une autre variable essentielle lors de la gestion des paramètres est $#
qui a pour valeur le nombre d'arguments transmis lors de l'appel du script.
#!/bin/bash
if [ $# -lt 1 ]; then
echo "Usage: $0 <votre prenom>"
exit 1
fi
echo "Bonjour $1"
#!/bin/bash
#Usage ./script je vais changer -ifs : le:nouveau:IFS
printf "je restitue des arguments 1 à 1.\nje change IFS.(cf man bash IFS/paramètres spéciaux)\n"
change=0
#cf man bash: Remplacement des paramètres
val=${@/*-ifs ? /}
args=${@/$val/}
printf "$args\n$val\n"
while test -n "$args"
do
for v in $args
do
if test $change -eq 1; then change=2; IFS="$v"; printf "<== NEW IFS: \'$IFS\' ==>\n"; fi
if test "$v" = "-ifs";then change=1; continue; fi
test $change -eq 0 && printf "==> $v\n"
test $change -eq 2 && change=0
done
args="$val"
val=""
done