Le bon administrateur va automatiser ce qui est possible pour gagner du temps.
Aujourd'hui, le scripting.
Il faut taper les scripts dans un éditeur de texte. J'utilise vim, un clone de 1). Pour avoir la couleur syntaxique, j'ai mis dans le fichier /home/linux/.vimrc:
syntax on
[[bash]]
Hello world
vi hello.sh
#!/bin/sh echo "Hello, world!"
Ensuite, le rendre exécutable:
chmod 755 hello.sh
ou
chmod744 hello.sh
Pour faire tourner le script:
./hello.sh
On ne peut pas l'appeler comme ceci:
hello.sh
parce que le répertoire dans lequel il se trouve n'est pas dans le PATH:
echo $PATH
$PATH est une variable (c'est-à-dire une zone mémoire).
Remplace “world” par une variable:
#!/bin/sh user="Toto" echo "Hello, $user!"
Demander à l'utilisateur d'entrer son nom:
#!/bin/sh read user echo "hello, $user!"
Parrot
Ecrire un script qui demande à l'utilisateur d'écrire, puis répéter.
#!/bin/sh read texte echo $texte
#!/bin/sh echo "Que dis-tu?" read texte echo "Quoi?" echo $texte
Arguments
Lorsqu'on tape une commande, comme
ls file
file est un argument. On peu y accéder dans le script: file est la variable $1 (argument1). S'il y a 2 arguments:
cat file1 file2
file2 est accessible comme $2 $0 reprend le nom de la commande.
Le script suivant sauvé comme arguments.sh:
#!/bin/sh echo "Le script est $0 et l'argument $1"
Donne comme sortie quand il est exécuté:
linux@debian:~$ ./arguments.sh arg Le script est ./arguments.sh et l'argument arg
Exercice 3
Créer un script script2cmd: Pour l'instant, pour lancer le script, il faut taper:
./nom_du_script
Il faut que le script change un script en une commande appartenant à root et avec les droits 755 (à mettre dans /usr/local/bin).
#!/bin/sh #transforme un script en commande #usage: # script2cmd script cp $1 /usr/local/bin/ chmod 755 /usr/local/bin/$1 chown root.root /usr/local/bin/$1
Résultat:
debian:/home/linux# ls -l /usr/local/bin total 4 -rwxr-xr-x 1 root root 54 Feb 18 13:44 hello.sh
Problème: les utilisateurs “normaux” ne peuvent pas écrire dans /usr/local/bin:
debian:/home/linux# ls -ld /usr/local/bin/ drwxrwsr-x 2 root staff 4096 Feb 18 13:46 /usr/local/bin/
Soit passer par sudo, soit changer les droits sur /usr/local/bin.
Exercice 4
Faire une commande lscd qui va monter le lecteur de CD-ROM, lister les fichiers dedans, et puis démonter le disque.
#!/bin/sh mount /cdrom ls -- color /cdrom umount /cdrom
Conditions
if [ condition ]; then action else action fi
Quand la condition est satisfaite c'est que sa valeur est zéro.
Le résultat de l'exécution d'un logiciel est zéro lorsque tout ce passe bien.
Exercice 5
Tester si l'utilisateur est root.
#!/bin/sh if [ $UID == 0 ]; then echo "You are root" else echo "You are not superuser" fi
Exercice 6
Tester si le CD-ROM est monté.
#!/bin/sh if mount | grep cdrom > /dev/null; then echo "Le CD-ROM est monte" else echo "Le CD-ROM n'est pas monté" fi
On peut aussi faire:
#!/bin/sh if mount | grep -q cdrom; then echo "Le CD-ROM est monte" else echo "Le CD-ROM n'est pas monté" fi
Note: si la condition est l'output d'un exécutable, il ne faut pas mettre de crochets.
La négation d'une condition s'écrit !condition: if ! mount | grep -q /cdrom then mount /cdrom 2> /dev/null fi
le 2> /dev/null signifie: redirige l'output des erreurs vers la poubelle (/dev/null est le périphérique poubelle, fictif)
Ceci evite d'afficher
mount: block device /dev/cdrom is write-protected, mounting read-only
à l'écran.
Tester si un fichier existe
test -f fichier
Script qui dit si un fichier dans le répertoire courant existe ou pas.
#!/bin/sh if test -f $1; then echo -e "le fichier $1 existe dans le repertoire courant \c" else echo -e "$1 non trouvé dans le repertoire courant \c" fi pwd
Boucles
for texte in truc machin bazar do echo $texte done
D'abord la variable texte va recevoir la valeur truc, puis, à l'itération suivante, texte va recevoir la valeur machin, et à la suivante, la valeur bazar.
Le script
for texte in $1 $2 $3 do echo $texte done
donne l'output suivant:
linux@debian:~$ ./parrot2.sh un deux trois un deux trois
Si on veut avoir un nombre indéfini d'arguments pour le script, il faut procéder comme suit.
#!/bin/sh while [ "$1" != "" ] do echo $1 shift done
shift déplace vers la gauche les arguments vers la gauche d'un cran: l'argument 2 ($2) devient $1, $3 devient $2, $n devient $(n-1).
Reste à voir case.