Le shell ::..

Introduction :.

Le shell n'est pas qu'un interpréteur de commandes. Il permet aussi un vrai travail de programmation, de créer des scriptes avec des variables, des opérateurs mathématiques, des fonctions, des structures de tests, des tests sur des entrées et des sorties.

Des commandes et des outils très puissants sont disponibles pour vous aider, tel que grep, gawk etc

On commence :.

En préambule

On travail en mode terminal. Une fois dans le vif du sujet, on peut lancer la commande ps pour connaître le shell utilisé


jp@NEPTUNE:~$ ps
  PID TTY          TIME CMD
 2890 pts/2    00:00:00 bash
 4195 pts/2    00:00:00 ps
jp@NEPTUNE:~$ 

jp@NEPTUNE:~$ bash --version
GNU bash, version 5.0.17(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2019 Free Software Foundation, Inc.
Licence GPLv3+ : GNU GPL version 3 ou ultérieure 

Ceci est un logiciel libre ; vous êtes libre de le modifier et de le redistribuer.
AUCUNE GARANTIE n'est fournie, dans les limites permises par la loi.
jp@NEPTUNE:~$

En regardant le résultat affiché ci-dessus, c'est avec le bash que l'on travail.
On affine le résultat en demandant la version du bash avec la commande bash --version

Ou avec la commande ci-dessous pour connaitre le shell d'un utilisateur, ici pour jp :)


~$ grep jp /etc/passwd
jp:x:1000:1000:jp,,,:/home/jp:/bin/bash
~$

Par défaut, le shell sous Debian, Ubuntu et d'autres distributions est Bash. Si vous souhaitez le modifier, pour le compte root ou alors pour un utilisateur précis, il vous suffit d'utiliser la commande chsh (change shell).

En premier lieu vous pouvez afficher dans le terminal le liste des shells disponibles avec la commande cat /etc/shells.

~$ cat /etc/shells
# /etc/shells: valid login shells
/bin/sh
/bin/bash
/usr/bin/bash
/bin/rbash
/usr/bin/rbash
/bin/dash
/usr/bin/dash
~$

Pour changer de shell, on tape la commande "exec sh" dans le terminal par exemple ! Les commandes varient quelque peu d'un shell à l'autre.

Rappel de l'idempotence

En mathématiques et en informatique, l'idempotence signifie qu'une opération a le même effet qu'on l'applique une ou plusieurs fois. On doit pourvoir lancer une commande et avoir le résultat escompté malgré le changement de situation dans la machine
Exemples


~$ mkdir sandbox
~$ l
total 80
....
drwxr-xr-x 2 jp jp 4096 sep 12 00:26 Public
drwxrwxr-x 2 jp jp 4096 jan 29 15:49 sandbox
drwxr-xr-x 7 jp jp 4096 jan 28 23:41 snap
drwxr-xr-x 2 jp jp 4096 jan 25 11:33 Téléchargements
....
~$ echo $?
0

Le résultat indique qu'il n'y a pas d'erreur avec un retour de 0

Si l'on relance la commande initiale


~$ mkdir sandbox
mkdir: impossible de créer le répertoire «sandbox»: Le fichier existe
~$ echo $?
1

L’environnement bash nous retourne un message d'erreur et le test avec la commande echo $? retourne bien une erreur "1"

Si l'on veut être idempotent, il faut alors rajouter à la commande mkdir le paramètre -p (a voir dans man mkdir). Ceci nous donne alors


~$ mkdir -p sandbox
~$ echo $?
0
~$

Alors avec la commande "echo $?" le résultat donne maintenant 0 et nous n'avons plus de message d'erreur en retour. Le traitement et les résultats sont identiques, que le répertoire existe ou pas 👍 Nous sommes bien en mode idempotent 😊
Pour le traitement dans un fichier de commande, c'est beaucoup mieux, surtout s'il y a une suite de commandes et de traitement.

rm xxx alors rm -f xxx

Structure d'un script :.

Le programme ou script se trouve sous la forme d'un fichier texte avec comme extension .sh ou rien ...
L'édition du fichier de commandes va se faire avec votre éditeur préféré tel vi, joe, nano ou Visual Studio :)
On placera au début du script le nom du bash utilisé ainsi que son emplacement.
Si on lance la commande ls -l *.sh (ls- l est ici mis en alias )


~$ l *.sh
-rwx--x--x 1 jp jp 450 avr  4  2012 table.sh
~$ 

~$ cat table.sh
#!/bin/bash
#
# Action  : Table de multiplication ...

y=1

echo -e ""

while [ $y -le 12 ]; do
    x=1
    while [ $x -le 12 ]; do
        printf "% 4d" $(( $x * $y ))
        let x++
    done
    echo ""
    let y++
done

# Fin du script
~$ 

Pour éditer le script, il faut utiliser vos éditeurs préférés, soit vi, joe, nano etc.
Pour lancer celui-ci, il faut le mettre en mode exécutable avec la commande


jp@NEPTUNE:~$ chmod +x table.sh

Pour l'exécuter, il faut lancer :


jp@NEPTUNE:~$ ./table.sh

   1   2   3   4   5   6   7   8   9  10  11  12
   2   4   6   8  10  12  14  16  18  20  22  24
   3   6   9  12  15  18  21  24  27  30  33  36
   4   8  12  16  20  24  28  32  36  40  44  48
   5  10  15  20  25  30  35  40  45  50  55  60
   6  12  18  24  30  36  42  48  54  60  66  72
   7  14  21  28  35  42  49  56  63  70  77  84
   8  16  24  32  40  48  56  64  72  80  88  96
   9  18  27  36  45  54  63  72  81  90  99 108
  10  20  30  40  50  60  70  80  90 100 110 120
  11  22  33  44  55  66  77  88  99 110 121 132
  12  24  36  48  60  72  84  96 108 120 132 144
jp@NEPTUNE:~$

:.

.

.