User Tools

Site Tools


coursieps:20050218

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.

coursieps/20050218.txt · Last modified: 2013/01/30 17:50 (external edit)