Dans ce chapitre nous allons aborder les possibilités de création de script en langage shell.
1 - Shell, un langage intégré
Le shell est un langage natif intégré aux systèmes Unix et ses dérivés, donc à mon Linux préféré. C'est un langage qui utilise principalement les commandes natives présentes dans le système ainsi que celles que vous ajouterez.
2 - Un shell, des shells
2.1 - sh : le shell historique
sh, Bourne Shell est présent depuis les origines dans les systèmes UNIX. Son papa est Stephen Bourne...
2.2 - bash, le shell moderne (Bourne Again Shell)
Le bash shell est une évolution directe du Bourne Shell. Il lui ajoute de nombreuses fonctionnalités modernes. C'est le shell par défaut de nombre de systèmes Linux, dont Ubuntu. C'est également le shell par défaut de macOS X.
3 - Mon premier script shell
3.1 - Utiliser un éditeur de texte (ou de code)
Il nous faut un éditeur de texte intégré au terminal, mais nous pouvons également utiliser un éditeur de code plus moderne. Nous utiliserons pico, dans l'immédiat.
pico mon_script.sh
3.2 - Déclarer quel shell sera utilisé
#!/bin/bash
Cette première ligne de notre fichier permet de déclarer le shell qui sera utilisé pour executer notre script. C’est le sha-bang ou shebang, que vous pouvez remplacer par le shell de votre choix. (sh, tcsh, bash, zsh, etc...) En cas d’absence, c’est le shell par défaut de l’utilisateur qui sera utilisé pour exécuter le script.
Le sha-bang pourrait tout aussi être :
#!/bin/php
...si vous souhaitiez réaliser un script PhP exécuté en local dans votre terminal.
3.3 - Quelques commandes de base
#Lister les fichiers présents dans un répertoire (rappel : tout est fichier)
ls
# Changer de répertoire
cd
# Créer un répertoire
mkdir
# Copier un fichier (Je vous ai déjà dit que tout était fichier ?)
cp
# Déplacer un fichier (Ça vous choque pas si je vous dit qu’un répertoire est un fichier ?)
mv
# Supprimer un fichier ou un répertoire
rm
# Créer des liens (symboliques.... ou pas)
ln
# Créer une archive ou extraire une archive
tar
# Réaliser une copier sécurisée sur une machine distante
scp
# Afficher quelque chose dans la console
echo
# chercher le mot "toto" dans le fichier test.txt
grep toto test.txt
# chercher le mot "toto" dans façon insensible à la casse dans tout le répertoire courant
grep -r -i toto ./
3.4 - Un script pour copier un répertoire sur une machine distante de manière sécurisée.
Nous voulons sauvegarder notre répertoire de travail, d’une importance cruciale, sur la machine de Thibaut (encore lui) grâce à l’utilisateur « machin ».
#!/bin/bash
# Définir les variables
repertoire='/var/www/formation'
moi='mon_prenom'
destination='/home/machin'
ip='192.168.9.107'
# Se déplacer dans mon répertoire utilisateur
cd ~/
# Créer l’archive du répertoire
tar -cf $moi.tar $repertoire
# Copie chez Thibaut
scp $moi.tar machin@$ip:$destination/$moi.tar
# Ici le script demandera le mot de passe de machin
# C’est fini, on affiche que c’est le cas
echo "J’ai finiiiiiiiiiii"
Après avoir enregistré notre script, nous pourrons l'appeler directement dans la console :
./mon_script.sh
Attention, il faudra que votre script sooit executable avec les droits appropriés :
chmod 700 mon_script.sh
3.5 - Réaliser une condition en bash
Nous pouvons utiliser une instruction de type « if » en bash.#!/bin/bash
if [ test ] then echo "Le test est positif" fi
...Et nous pouvons même lui ajouter un else :
#!/bin/bash if [ test ] then echo "Le test est positif" else echo "C'est négatif" fi
3.6 - Passer un argument ou plusieurs arguments à votre script
Nous pouvons passer directement des arguments en ligne de commande à notre script, ces derniers sont récupérés grâce à $1, $2, $n...
#!/bin/bash # test des arguments if [ $# -ne 1 ] then echo "Le nombre d'arguments n'est pas correct" exit fi # Récupération des arguments repertoire="/var/www/formation" moi=$1 destination="/home/machin" ip='192.168.9.107' # On affiche echo "Bonjour $moi" echo "Il y a $# argument(s)" # Se déplacer dans mon répertoire utilisateur cd ~/ # Créer l’archive du répertoire tar -cf $moi.tar $repertoire if [ $? -ne 0 ] then echo "La commande TAR a échoué..." exit fi # Copie chez Thibaut scp $moi.tar machin@$ip:$destination/$moi.tar if [ $? -ne 0 ] then echo "La commande SCP a échoué..." exit fi
# Ici le script demandera le mot de passe de machin
# C’est fini, on affiche que c’est le cas
echo "J’ai finiiiiiiiiiii"
#!/bin/bash
cd machinchose
echo "Voici le code de retour : $?"
3.7 - Quelques opérateurs
# L’égalité
$1 = "patate"
# La différence
$1 != "patate"
# Une chaîne vide (zéro)
-z $1
# Une chaîne non vide
-n $1
# Condition logique ET
$1 = "patate" && $2 = "pomme"
# Condition logique OU
$1 = "patate" || $1 = "pomme"
# La négation
if [ ! -n $1 ]
# La différence entre 2 nombres
$1 -ne $2
On peut donc tester la présence d'un argument dans notre script :
#!/bin/bash
if [ -z $1 ]
then
echo "Hey ! T’as pas oublié un truc là ?!"
exit
fi
3.8 - Quelques variables pratiques
# Le nombre d’arguments
echo $#
# Le code de retour de la dernière commande
$?
Ainsi nous pouvons tester si le nombre d'arguments est correct ou si la dernière commande réalisée dans notre script retourné un code correct (en général 0)
#!/bin/bash # On teste si l'argument 1 n'est pas vide if [ -z $1 ] then echo "Hey ! Vous avez oublié d'indiquer votre nom !" exit fi # Récupération des arguments repertoire='/var/www/formation' moi=$1 destination='/home/machin' # Se déplacer dans mon répertoire utilisateur cd ~/ # Créer l’archive du répertoire tar -cf $moi.tar $repertoire # On test le retour de la commande tar if [ $? -ne 0 ] then echo "La commande TAR a échoué... C'est ballot..." exit fi # Copie chez Guillaume scp $moi.tar $destination/$moi.tar # Ici le script demandera le mot de passe de machin # C’est fini, on affiche que c’est le cas echo "J’ai finiiiiiiiiiii"
A vous de jouer !
Trouvez une bonne idée et réalisez le script de votre choix.