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.