Programmation Bash/Scripts

Un livre de Wikilivres.


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.

Au commencement, la ligne shebang[modifier | modifier le wikicode]

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[modifier | modifier le wikicode]

Avant 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 | modifier le wikicode]

#!/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[modifier | modifier le wikicode]

Les 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