Les bases du Shell

Si vous utilisez un serveur Linux, il peut être utile d'utiliser le langage Shell qui permet d’exécuter du code. Voici quelques bases pour commencer.

Jérémy 🤘
Jérémy 🤘

Si vous utilisez un serveur Linux, il peut être utile d'utiliser le langage Shell qui permet d’exécuter du code un peu comme on le ferait avec des fichiers batch (ou *.bat) sous Windows.

Avant de commencer la programmation je vais vous détailler un peu plus le Shell.

Qu'est-ce que le Shell ?

Alors non le Shell n'est pas le nom d'un géant pétrolier mais un langage de programmation des systèmes Unix (Linux et Mac).

Si l'on traduit le mot Shell en français cela nous donne coquille, coque ou coquillage. C'est un interpréteur de commandes qui permet d'avoir accès aux commandes et fonctionnalités internes du système d'exploitation. Il est accessible depuis la console ou un terminal.

Programmation

Maintenant que l'on en sait un peu plus on va commencer à programmer. Cet article étant pour les novices, je vais essayer de détailler au mieux ce que je vais faire mais je vais aussi ne faire que des codes simples qui peuvent servir. Je ne vais pas me lancer à faire des scripts trop complexes.

Avant de commencer n'importe quel script il faut lui indiquer le type de Shell que nous allons utiliser. Nous allons utiliser le plus connu le bash (Bourne-Again Shell) :

Copier
#!/bin/bash
#!/bin/bash

Voici un script (liste.sh) très simple qui permet de lister les fichiers qui sont dans le dossier de mon script :

Copier
#!/bin/bash

# Permet de dire que le script sera en UTF-8 et du coup les accents seront pris en charge
export LANG="fr_FR.UTF-8";

# Permet d'afficher un message à l'utilisateur qui va lancer le script
echo Voici les fichiers qui sont dans ce dossier :

# Liste tous les fichiers et dossier du répertoire courant
ls

# Ferme le script après l’exécution
exit 0
#!/bin/bash

# Permet de dire que le script sera en UTF-8 et du coup les accents seront pris en charge
export LANG="fr_FR.UTF-8";

# Permet d'afficher un message à l'utilisateur qui va lancer le script
echo Voici les fichiers qui sont dans ce dossier :

# Liste tous les fichiers et dossier du répertoire courant
ls

# Ferme le script après l’exécution
exit 0

Alors oui c'est très bien mais comment je fais pour le lancer.

Copier
sh liste.sh
sh liste.sh

Les variables

La création d'une variable est très simple :

Copier
# Il ne doit y avoir aucun espace de chaque cotés du =, sinon vous aurez une erreur
ma_variable="Une chaîne de caractère par exemple"

# Affichage de ma variable
echo $ma_variable
# Il ne doit y avoir aucun espace de chaque cotés du =, sinon vous aurez une erreur
ma_variable="Une chaîne de caractère par exemple"

# Affichage de ma variable
echo $ma_variable

En Shell il n'y a pas de concaténation donc voici comment rajouter du texte à la fin de notre variable à la fin :

Copier
ma_variable="Une chaîne de caractère par exemple"
ma_variable="$ma_variable avec du texte à la fin"
ma_variable="Une chaîne de caractère par exemple"
ma_variable="$ma_variable avec du texte à la fin"

Le choix dans la date

Nous pouvons aussi manipuler les dates en Shell :

Copier
# Afficher la date du jour
echo $(date) # Wed Jul 22 12:40:36 GMT 2015
# Afficher la date du jour
echo $(date) # Wed Jul 22 12:40:36 GMT 2015

Si l'on souhaite afficher d'autres informations comme par exemple la date au format dd/mm/aaaa hh:mm:ss

Copier
# Le + permet de passer des paramètres à la fonction et les %d, %m ... sont les paramètres.
# Le \ avant le %T ou %H permet d’échapper l'espace car sinon il crée une erreur

echo $(date +%d/%m/%Y\ %T)

# ou
echo $(date +%d/%m/%Y\ %H:%M:%S)
# Le + permet de passer des paramètres à la fonction et les %d, %m ... sont les paramètres.
# Le \ avant le %T ou %H permet d’échapper l'espace car sinon il crée une erreur

echo $(date +%d/%m/%Y\ %T)

# ou
echo $(date +%d/%m/%Y\ %H:%M:%S)

Si vous souhaitez voir tous les paramètres, voici un lien qui les résume tous, et en français : http://www.christopher.compagnon.name/techno/shell-date.html

Les opérateurs (>=, >, <=, <)

Les opérateurs sont très simple à comprendre

Supérieur à (>)

Copier
-gt
-gt

Supérieur ou égal à (>=)

Copier
-ge
-ge

Inférieur à (<)

Copier
-lt
-lt

Inférieur ou égale à (<=)

Copier
-le
-le

Les instructions (if, else, elif)

Copier
var=4

# Notez bien cette fois-ci les espaces dans les conditions qui sont important
if [ $var = 1 ]
then
     echo "non"
elif [ $var = 2 ]
then
     echo "toujours pas"
else
     echo "j'abandonne"
fi
var=4

# Notez bien cette fois-ci les espaces dans les conditions qui sont important
if [ $var = 1 ]
then
     echo "non"
elif [ $var = 2 ]
then
     echo "toujours pas"
else
     echo "j'abandonne"
fi

Les boucles (while, until, for)

while

Le while veut dire "tant que". Tant que ma condition est réussie je continue ma boucle.

Copier
while ma_condition
     do mon_script
done
while ma_condition
     do mon_script
done

until

Le until (jusqu'à ce que) fonctionne de la façon inverse. Je fais mon script jusqu'à ce que ma condition soit vérifiée.

Copier
until ma_condition
 do mon_script
done
until ma_condition
 do mon_script
done

Pour faire simple. Tant que je dis la vérité, je ne suis pas un menteur. Mais jusqu'à ce que je dise un mensonge, je suis un menteur. Cela peut paraître un peu complexe mais ce n'est rien. Quand vous ferez vos premiers scripts vous comprendrez.

for

Le for fonctionne un peu comme le for de twig (pour ceux qui utilisent ce moteur de template).

Copier
for element in elements
    do echo "$element"
done
for element in elements
    do echo "$element"
done

Exercice

Voici un exercice assez simple pour voir si vous avez compris le fonctionnement du Shell.

Vous devrez faire un script qui demande à l'utilisateur de rentrer un mot de passe (que vous aurez défini) et vous lui demanderez de le rentrer à chaque fois si le mot de passe n'est pas le bon. Ensuite, une fois qu'il aura trouvé le bon mot de passe demandez lui son âge. Il doit être supérieur à 20, sinon dites-lui qu'il est trop jeune. Inférieur ou égale à 30, sinon dites-lui qu'il est trop vieux. Et enfin s'il a le bon age, dites lui que c'est parfait.

Aide

Pour récupérer le contenu de ce que l'utilisateur va taper il faut faire :

Copier
echo "Ma question"
read reponse
echo "Ma question"
read reponse

reponse est automatiquement une variable.

Voilà, j'espère que ce petit tuto vous aidera à débuter avec le Shell, et si vous avez des questions ou remarques, laissez-les dans les commentaires.

PS : La réponse est juste après, je vous laisse faire une auto-correction, et en cas de doute, mettez votre proposition dans les commentaires.

Réponse

Copier
#!/bin/bash

magic_word="secret"

echo "Quel est le mot magique ?"
read mot_magique

while [ $magic_word != $mot_magique ]
do
     echo "Ce n'est pas le bon mot. Réssayez :"
     read mot_magique
done

echo "Bravo ! Mais quel est ton age ?"
read age

if [ $age -le 20 ]
then
          echo "Trop jeune !"
elif [ $age -gt 30 ]
then
          echo "Trop vieux !"
else
          echo "Parfait !"
fi

exit 0
#!/bin/bash

magic_word="secret"

echo "Quel est le mot magique ?"
read mot_magique

while [ $magic_word != $mot_magique ]
do
     echo "Ce n'est pas le bon mot. Réssayez :"
     read mot_magique
done

echo "Bravo ! Mais quel est ton age ?"
read age

if [ $age -le 20 ]
then
          echo "Trop jeune !"
elif [ $age -gt 30 ]
then
          echo "Trop vieux !"
else
          echo "Parfait !"
fi

exit 0