Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Prochaine révision
Révision précédente
elearning:workbooks:redhat:rh134:l100 [2024/09/26 13:22] – created adminelearning:workbooks:redhat:rh134:l100 [2024/10/21 11:20] (Version actuelle) admin
Ligne 5: Ligne 5:
 Dernière mise-à-jour : ~~LASTMOD~~ Dernière mise-à-jour : ~~LASTMOD~~
  
-======LCF505 Gestion des Tâches======+======RH13401 Les Scripts Shell======
  
 =====Contenu du Module===== =====Contenu du Module=====
  
-  * **LCF505 Gestion des Tâches**+  * **RH13401 Les Scripts Shell**
     * Contenu du Module     * Contenu du Module
-    * LAB #1 - cron +    * LAB #1 - Les Scripts Shell 
-      * 1.1 - Le Fichier /etc/crontab +      * 1.1 - Exécution 
-      * 1.2 - Les Champs Temporels +      * 1.2 - La commande read 
-      * 1.3 - Les crontabs Utilisateurs +        * Code de retour 
-    LAB #2 - anacron +        * La variable IFS 
-      * 2.Le Fichier /etc/anacrontab +      * 1.3 - La commande test 
-      * 2.Les Champs Temporels +        * Tests de Fichiers 
-      * 2.Le Fichier /var/spool/anacron/cron.daily +        * Tests de chaînes de caractère 
-    LAB #3 at +        * Tests sur des nombres 
-      * 3.1 - Le Répertoire /var/spool/at/+        * Les opérateurs 
 +        Tests d'environnement utilisateur 
 +      * 1.La commande %%[[ expression ]]%% 
 +      * 1.Opérateurs du shell 
 +      * 1.L'arithmétique 
 +        La commande expr 
 +          * Opérateurs Arithmétiques 
 +          * Opérateurs de Comparaison 
 +          * Opérateurs Logiques 
 +        * La commande let 
 +          * Opérateurs Arithmétiques 
 +          * Opérateurs de comparaison 
 +          * Opérateurs Logiques 
 +          * Opérateurs travaillant sur les bits 
 +      * 1.7 Structures de contrôle 
 +        * If 
 +        * case 
 +          * Exemple 
 +      * 1.8 - Boucles 
 +          * for 
 +          * while 
 +          * Exemple 
 +      * 1.9 Scripts de Démarrage 
 +        * ~/.bash_profile 
 +        * ~/.bashrc  
 +      * 1.10 - Rappel des Expressions Régulières dans Bash
  
-=====cron=====+===== LAB #1 - Les Scripts Shell ===== 
 + 
 +Le but de la suite de cette unité est de vous amener au point où vous êtes capable de comprendre et de déchiffrer les scripts, notamment les scripts de démarrage ainsi que les scripts de contrôle des services.  
 + 
 +Écrire des scripts compliqués est en dehors de la portée de cette unité car il nécessite une approche programmation qui ne peut être adressée que lors d'une formation dédiée à l'écriture des scripts. 
 + 
 +==== 1.1 - Exécution ==== 
 + 
 +Un script shell est un fichier dont le contenu est lu en entrée standard par le shell. Le contenu du fichier est lu et exécuté d'une manière séquentielle. Afin qu'un script soit exécuté, il suffit qu'il puisse être lu au quel cas le script est exécuté par un shell fils soit en l'appelant en argument à l'appel du shell : 
 + 
 +**/bin/bash myscript** 
 + 
 +soit en redirigeant son entrée standard : 
 + 
 +**/bin/bash < myscript** 
 + 
 +Dans le cas où le droit d'exécution est positionné sur le fichier script et à condition que celui-ci se trouve dans un répertoire spécifié dans le PATH de l'utilisateur qui le lance, le script peut être lancé en l'appelant simplement par son nom : 
 + 
 +**myscript** 
 + 
 +Pour lancer le script sans qu'il soit dans un répertoire du PATH, il convient de se placer dans le répertoire contenant le script et de le lancer ainsi : 
 + 
 +**./myscript** 
 + 
 +Dans le cas où le script doit être exécuté par le shell courant, dans les mêmes conditions que l'exemple précédent, et non par un shell fils, il convient de le lancer ainsi : 
 + 
 +**. myscript** 
 + 
 +Dans un script il est fortement conseillé d'inclure des commentaires. Les commentaires permettent à d'autres personnes de comprendre le script. Toute ligne de commentaire commence avec le caractère **#**.  
 + 
 +Il existe aussi un **pseudo commentaire** qui est placé au début du script. Ce pseudo commentaire permet de stipuler quel shell doit être utilisé pour l'exécution du script. L'exécution du script est ainsi rendu indépendant du shell de l'utilisateur qui le lance. Le pseudo commentaire commence avec les caractères **#!**. Chaque script commence donc par une ligne similaire à celle-ci : 
 + 
 +  #!/bin/sh 
 + 
 +Puisque un script contient des lignes de commandes qui peuvent être saisies en shell intéractif, il est souvent issu d'une procédure manuelle. Afin de faciliter la création d'un script il existe une commande, **script**, qui permet d'enregistrer les textes sortis sur la sortie standard, y compris le prompt dans un fichier dénommé **typescript**. Afin d'illustrer l'utilisation de cette commande, saisissez la suite de commandes suivante : 
 + 
 +<code> 
 +[trainee@redhat9 ~]$ script 
 +Script started, output log file is 'typescript'
 + 
 +[trainee@redhat9 ~]$ pwd 
 +/home/trainee 
 + 
 +[trainee@redhat9 ~]$ ls 
 +Desktop  Documents  Downloads  Music  Pictures  Public  Templates  typescript  Videos 
 + 
 +[trainee@redhat9 ~]$ exit 
 +exit 
 +Script done. 
 + 
 +[trainee@redhat9 ~]$ cat typescript 
 +Script started on 2024-10-21 11:57:26+02:00 [TERM="xterm-256color" TTY="/dev/pts/0" COLUMNS="86" LINES="24"
 +[trainee@redhat9 ~]$ pwd 
 +/home/trainee 
 +[trainee@redhat9 ~]$ ls 
 +Desktop  Documents  Downloads  Music  Pictures  Public  Templates  typescript  Videos 
 +[trainee@redhat9 ~]$ exit 
 +exit 
 + 
 +Script done on 2024-10-21 11:57:36+02:00 [COMMAND_EXIT_CODE="0"
 +</code> 
 + 
 +Cette procédure peut être utilisée pour enregistrer une suite de commandes longues et compliquées afin d'écrire un script. 
 + 
 +Pour illustrer l'écriture et l'exécution d'un script, créez le fichier **myscript** avec **vi** : 
 + 
 +<code> 
 +[trainee@redhat9 ~]$ vi myscript  
 +[trainee@redhat9 ~]$ cat myscript  
 +pwd 
 +ls 
 +</code> 
 + 
 +Sauvegardez votre fichier. Lancez ensuite votre script en passant le nom du fichier en argument à /bin/bash : 
 + 
 +<code> 
 +[trainee@redhat9 ~]$ /bin/bash myscript 
 +/home/trainee 
 +Desktop    Downloads  myscript  Public     typescript 
 +Documents  Music      Pictures  Templates  Videos 
 +</code> 
 + 
 +Lancez ensuite le script en redirigeant son entrée standard : 
 + 
 +<code> 
 +[trainee@redhat9 ~]$ /bin/bash < myscript 
 +/home/trainee 
 +Desktop    Downloads  myscript  Public     typescript 
 +Documents  Music      Pictures  Templates  Videos 
 +</code> 
 + 
 +Pour lancer le script en l'appelant simplement par son nom, son chemin doit être inclus dans votre PATH: 
 + 
 +<code> 
 +[trainee@redhat9 ~]$ echo $PATH 
 +/home/trainee/.local/bin:/home/trainee/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin 
 +</code> 
 + 
 +Dans le cas de RHEL 9, même si PATH contient $HOME/bin, le répertoire n'existe pas : 
 + 
 +<code> 
 +[trainee@redhat9 ~]$ ls 
 +Desktop    Downloads  myscript  Public     typescript 
 +Documents  Music      Pictures  Templates  Videos 
 +</code> 
 + 
 +Créez donc ce répertoire : 
 + 
 +<code> 
 +[trainee@redhat9 ~]$ mkdir bin 
 +</code> 
 + 
 +Ensuite déplacez votre script dans ce répertoire et rendez-le exécutable pour votre utilisateur : 
 + 
 +<code> 
 +[trainee@redhat9 ~]$ mv myscript ~/bin 
 +[trainee@redhat9 ~]$ chmod u+x ~/bin/myscript  
 +</code> 
 + 
 +Exécutez maintenant votre script en l'appelant par son nom à partir du répertoire **/tmp** : 
 + 
 +<code> 
 +[trainee@redhat9 ~]$ cd /tmp 
 + 
 +[trainee@redhat9 tmp]$ myscript 
 +/tmp 
 +dbus-BKNtynzn0b 
 +dbus-G7skg3Wlpv 
 +dbus-pGKMf26gAW 
 +systemd-private-c3bb2399f5814488bf583ccb169e7ffc-colord.service-GbUnUn 
 +systemd-private-c3bb2399f5814488bf583ccb169e7ffc-dbus-broker.service-94ZOZ9 
 +systemd-private-c3bb2399f5814488bf583ccb169e7ffc-kdump.service-waLNMP 
 +systemd-private-c3bb2399f5814488bf583ccb169e7ffc-ModemManager.service-7yMSFI 
 +systemd-private-c3bb2399f5814488bf583ccb169e7ffc-power-profiles-daemon.service-NP07Sj 
 +systemd-private-c3bb2399f5814488bf583ccb169e7ffc-rtkit-daemon.service-FHomNd 
 +systemd-private-c3bb2399f5814488bf583ccb169e7ffc-switcheroo-control.service-QyA5XT 
 +systemd-private-c3bb2399f5814488bf583ccb169e7ffc-systemd-logind.service-S5YYJs 
 +systemd-private-c3bb2399f5814488bf583ccb169e7ffc-upower.service-Cd1DLj 
 +</code> 
 + 
 +Placez-vous dans le répertoire contenant le script et saisissez les commandes suivantes : 
 + 
 +<code> 
 +[trainee@redhat9 tmp]$ cd ~/bin 
 + 
 +[trainee@redhat9 bin]$ ./myscript 
 +/home/trainee/bin 
 +myscript 
 + 
 +[trainee@redhat9 bin]$ . myscript 
 +/home/trainee/bin 
 +myscript 
 +</code> 
 + 
 +====1.2 - La commande read==== 
 + 
 +La commande **read** lit son entrée standard et affecte les mots saisis dans la ou les variable(s) passée(s) en argument. La séparation entre le contenu des variables est l'espace. Par conséquent il est intéressant de noter les exemples suivants : 
 + 
 +<code> 
 +[trainee@redhat9 bin]$ read var1 var2 var3 var4 
 +fenestros edu is great! 
 + 
 +[trainee@redhat9 bin]$ echo $var1 
 +fenestros 
 + 
 +[trainee@redhat9 bin]$ echo $var2 
 +edu 
 + 
 +[trainee@redhat9 bin]$ echo $var3 
 +is 
 + 
 +[trainee@redhat9 bin]$ echo $var4 
 +great! 
 +</code>
  
 <WRAP center round important 60%> <WRAP center round important 60%>
-**Important** : Le service crond présume que la machine est allumée en permanence.+**Important**: Notez que chaque champs a été placé dans une variable différente. Notez aussi que par convention les variables déclarées par des utilisateurs sont en miniscules afin de les distinguer des variables système qui sont en majuscules.
 </WRAP> </WRAP>
  
-Le service crond est normalement lancé au démarrage de la machine. Ce service est chargé de faire exécuter des tâches ( commandes et scripts ) à des moments précis. Le service crond présume que la machine est allumée en permanence.+<code> 
 +[trainee@redhat9 bin]$ read var1 var2 
 +fenestros edu is great!
  
-Le service crond lit toutes les minutes le fichier **/etc/crontab**, les crontabs se trouvant dans **/etc/cron.d** ainsi que les fichiers propres à chaque utilisateur.+[trainee@redhat9 bin]$ echo $var1 
 +fenestros
  
-Si une commande produit une sortie, celle-ci est dirigée vers la messagerie.+[trainee@redhat9 bin]$ echo $var2 
 +edu is great! 
 +</code>
  
-L'utilisation de crond est réservé à root. Cependant, vous pouvez établir une liste d'utilisateurs qui ont la permission d'utiliser crond en créant un fichier nommé **cron.allow** dans **/etc**. A l'inverse, un fichier **cron.deny** peut contenir une liste d'utilisateurs qui n'ont pas la permission d'utiliser crond.+<WRAP center round important 60%> 
 +**Important** : Notez que dans le deuxième cas, le reste de la ligne après le mot //fenestros// est mis dans **$var2**. 
 +</WRAP>
  
-Sous RHEL/CentOS, les crontabs des utilisateurs ont comme nom, le nom de l'utilisateur qui les crée et se trouvent dans le répertoire **/var/spool/cron/**. Par exemple, le crontab propre à l'utilisateur trainee est le fichier **/var/spool/cron/trainee**. Le service crond exécute des tâches en rajoutant une ligne dans son fichier de journalisation **/var/log/cron**.+===Code de retour===
  
-====1.1 Le Fichier /etc/crontab====+La commande **read** renvoie un code de retour de **0** dans le cas où elle ne reçoit pas l'information **fin de fichier** matérialisée par les touches <key>C-d</key>. Le contenu de la variable **var** peut être vide et la valeur du code de retour **0** grâce à l'utilisation de la touche <key>entrée</key> :
  
-Sous RHEL/CentOS le fichier /etc/crontab prend la forme suivante :+<code> 
 +[trainee@redhat9 bin]$ read var 
 +</code> 
 +<key>Entrée</key> 
 +<code> 
 +[trainee@redhat9 bin]$ echo $? 
 +
 +[trainee@redhat9 bin]$ echo $var
  
 +[trainee@redhat9 bin]$ 
 +</code>
 +
 +Le contenu de la variable **var1** peut être vide et la valeur du code de retour **autre que 0** grâce à l'utilisation des touches <key>C-d</key> :
 +
 +<code>
 +[trainee@redhat9 bin]$ read var
 +</code>
 +<key>C-d</key>
 <code> <code>
-[root@centos8 ~]# cat /etc/crontab 
-SHELL=/bin/bash 
-PATH=/sbin:/bin:/usr/sbin:/usr/bin 
-MAILTO=root 
  
-# For details see man 4 crontabs+[trainee@redhat9 bin]$ echo $? 
 +
 +[trainee@redhat9 bin]$ read var
  
-# Example of job definition: +[trainee@redhat9 bin]$ echo $? 
-# .---------------- minute (0 - 59) +1 
-# |  .------------- hour (0 - 23) + 
-# |  |  .---------- day of month (1 - 31) +[trainee@redhat9 bin]$  
-# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ... +</code> 
-  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat + 
-# |   |  |  | +===La variable IFS=== 
-# *  *  *  *  * user-name  command to be executed+ 
 +La variable IFS contient par défaut les caractères <key>espace</key><key>tab</key> et <key>entrée</key>
 + 
 +<code> 
 +[trainee@redhat9 bin]$ echo "$IFS" od -c 
 +0000000      \t  \n  \n 
 +0000004
 </code> </code>
  
 <WRAP center round important 60%> <WRAP center round important 60%>
-**Important** - Dans le fichier /etc/crontab, on peut constater la définition de variables dont SHELL, MAILTO et PATH. Ces variables sont différentes des variables système. Notez que sous RHEL/CentOS, le fichier **/etc/crontab** ne contient aucune tâche à exécuter.+**Important** : La commande **od** (//Octal Dump//) renvoie le contenu d'un fichier ou de l'entrée standard au format octal. Ceci est utile afin de visualiser les caractères non-imprimables. L'option **-c** permet de sélectionner des caractères ASCII ou des backslash dans le fichier ou dans le contenu fourni à l'entrée standard.
 </WRAP> </WRAP>
  
-====1.2 - Les Champs Temporels====+La valeur de cette variable définit donc le séparateur de mots lors de la saisie des contenus des variables avec la commande **read**La valeur de la variable **IFS** peut être modifiée :
  
-Chaque ligne dans un fichier /etc/crontab contient 5 champs temporels qui décrivent le périodicité de l'exécution de la tâche concernée.+<code> 
 +[trainee@redhat9 bin]$ IFS=":"
  
-Les 5 champs sont :+[trainee@redhat9 bin]$ echo "$IFS" | od -c 
 +0000000    \n 
 +0000002 
 +</code>
  
-^ Minutes ^ Heures ^ Jour du mois ^ Mois de l'année ^ Jour de la sem. ^ +De cette façon l'espace redevient un caractère normal :
-|  (0-59)  |  (0-23)  |  (1-31)  |  (1-12)  |  (0-6)*  |+
  
-* le 0 correspond à dimanche.+<code> 
 +[trainee@redhat9 bin]$ read var1 var2 var3 
 +fenestros:edu is:great!
  
-Les champs temporels peuvent contenir des valeurs différentes :+[trainee@redhat9 bin]$ echo $var1 
 +fenestros
  
-^ Exemple ^ Description ^ +[trainee@redhat9 bin]$ echo $var2 
-| Une valeur absolue telle 10 | Dans le champs minutes = 10 minutes après l'heure | +edu is 
-| Une série de valeurs telle 2,6,8 | Dans le champs mois = février, juin et août | + 
-| Une intervalle telle 1-5 | Dans le champs Jour de la Semaine = du lundi au vendredi | +[trainee@redhat9 bin]$ echo $var3 
-| Le joker * | Dans le champs minutes = toutes les minutes | +great! 
-| Une périodicité telle 0-23/2 | Dans le champs heures = toutes les deux heures |+</code>
  
-Par exemple, voici le fichier **/etc/cron.d/0hourly** :+Restaurez l'ancienne valeur de IFS :
  
 <code> <code>
-[root@centos8 ~]# cat /etc/cron.d/0hourly  +[trainee@redhat9 bin]$ unset IFS
-# Run the hourly jobs +
-SHELL=/bin/bash +
-PATH=/sbin:/bin:/usr/sbin:/usr/bin +
-MAILTO=root +
-01 * * * * root run-parts /etc/cron.hourly+
 </code> </code>
  
-====1.3 - Les crontabs Utilisateurs====+====1.3 - La commande test====
  
-Chaque utilisateur peut avoir sa propre version d'un fichier crontab. Pour vérifier s'il existe une version de crontab pour lui, l'utilisateur lancera la commande suivante :+La commande **test** peut être utilisée avec deux syntaxes : 
 + 
 +**test** //expression// 
 + 
 +ou 
 + 
 +**[**<key>espace</key>//expression//<key>espace</key>**]** 
 + 
 +===Tests de Fichiers=== 
 + 
 +^ Test ^ Description ^ 
 +| -f fichier | Retourne vrai si fichier est d'un type standard | 
 +| -d fichier | Retourne vrai si fichier est d'un type répertoire | 
 +| -r fichier | Retourne vrai si l'utilisateur peut lire fichier | 
 +| -w fichier | Retourne vrai si l'utilisateur peut modifier fichier | 
 +| -x fichier | Retourne vrai si l'utilisateur peut exécuter fichier | 
 +| -e fichier | Retourne vrai si fichier existe | 
 +| -s fichier | Retourne vrai si fichier n'est pas vide | 
 +| fichier1 -nt fichier2 | Retourne vrai si fichier1 est plus récent que fichier2 | 
 +| fichier1 -ot fichier2 | Retourne vrai si fichier1 est plus ancien que fichier2 | 
 +| fichier1 -ef fichier2 | Retourne vrai si fichier1 est identique à fichier2 | 
 + 
 + 
 +Testez si le fichier **a100** est un fichier ordinaire :
  
 <code> <code>
-[root@centos8 ~]# exit +[trainee@redhat9 bin]$ mkdir ../training 
-logout + 
-[trainee@centos8 ~]$ crontab -l +[trainee@redhat9 bin]$ cd ../training 
-no crontab for trainee+ 
 +[trainee@redhat9 training]$ touch a100 
 + 
 +[trainee@redhat9 training]$ test -f a100 
 + 
 +[trainee@redhat9 training]$ echo $? 
 +
 + 
 +[trainee@redhat9 training]$ [ -f a100 ] 
 + 
 +[trainee@redhat9 training]$ echo $? 
 +0
 </code> </code>
  
-Afin de créer votre fichier crontab, lancez la commande crontab avec l'option -e en tant que votre nom d'utilisateur et non en tant que root :+Testez si le fichier a101 existe :
  
 <code> <code>
-[trainee@centos8 ~]$ crontab -e+[trainee@redhat9 training]$ -f a101 ] 
 + 
 +[trainee@redhat9 training]$ echo $? 
 +1
 </code> </code>
  
-Cette commande lance l'interface de l'éditeur **vi**. Tapez ensuite le texte suivant :+Testez si /home/trainee/training est un répertoire :
  
-<file+<code
-* * * * * /bin/pwd > pwd.txt +[trainee@redhat9 training]$ [ -d /home/trainee/training ]
-</file>+
  
-Sauvegardez et quittez vi.+[trainee@redhat9 training]$ echo $? 
 +
 +</code>
  
-Vous obtiendrez un résultat similaire à celui-ci :+===Tests de chaînes de caractère=== 
 + 
 +^ Test ^ Description ^ 
 +-n chaîne | Retourne vrai si chaîne n'est pas de longueur 0 | 
 +| -z chaîne | Retourne vrai si chaîne est de longueur 0 | 
 +| string1 = string2 | Retourne vrai si string1 est égale à string2 | 
 +| string1 != string2 | Retourne vrai si string1 est différente de string2 | 
 +| string1 | Retourne vrai si string1 n'est pas vide | 
 + 
 +Testez si les deux chaînes sont égales :
  
 <code> <code>
-[trainee@centos8 ~]$ crontab -e +[trainee@redhat9 training]$ string1="root" 
-no crontab for trainee - using an empty one + 
-crontab: installing new crontab+[trainee@redhat9 training]$ string2="fenestros" 
 + 
 +[trainee@redhat9 training]$ echo $string1 
 +root 
 + 
 +[trainee@redhat9 training]$ echo $string2 
 +fenestros 
 + 
 +[trainee@redhat9 training]$ [ $string1 = $string2 ] 
 + 
 +[trainee@redhat9 training]$ echo $? 
 +1
 </code> </code>
  
-<WRAP center round important 60%> +Testez si la string1 n'a pas de longueur 0 :
-**Important** Ce fichier crontab va être exécuté toutes les minutes. La commande va inscrire le répertoire courant dans le fichier pwd.txt. +
-</WRAP>+
  
-Le fichier crontab que vous venez de créer, au nom de votre utilisateur, a été écrit sur le disque dans le répertoire **/var/spool/cron/**.+<code> 
 +[trainee@redhat9 training]$ [ -n $string1 ]
  
-Malgré le fait que vous venez de l'éditer, vous ne pouvez pas visualiser votre fichier en tant que simple utilisateur avec la commande cat. Seule la commande crontab -e vous permettra de consulter ou modifier votre fichier crontab. +[trainee@redhat9 training]$ echo $? 
 +
 +</code>
  
-Passez donc en mode super-utilisateur et visualisez le fichier en utilisant la commande cat :+Testez si la string1 a une longueur de 0 :
  
 <code> <code>
-[trainee@centos8 ~]$ su +[trainee@redhat9 training]$ -z $string1 ] 
-Password: fenestros + 
-[root@centos8 ~]# cat /var/spool/cron/trainee +[trainee@redhat9 training]$ echo $? 
-* * * * * /bin/pwd > pwd.txt+1
 </code> </code>
  
-Afin d'accorder ou non le droit d'éditer son propre fichier crontab, root a la possibilité d'inscrire les noms d'utilisateurs dans un des deux fichiers :+===Tests sur des nombres===
  
-  * **/etc/cron.allow** pour accorder le droit d'éditer son propre fichier crontab +^ Test ^ Description ^ 
-  * **/etc/cron.deny** pour interdire le droit d'éditer son propre fichier crontab+| value1 -eq value2 | Retourne vrai si value1 est égale à value2 | 
 +| value1 -ne value2 | Retourne vrai si value1 n'est pas égale à value2 | 
 +| value1 -lt value2 | Retourne vrai si value1 est inférieure à value2 | 
 +| value1 -le value2 | Retourne vrai si value1 est inférieur ou égale à value2 | 
 +| value1 -gt value2 | Retourne vrai si value1 est supérieure à value2 | 
 +| value1 -ge value2 | Retourne vrai si value1 est supérieure ou égale à value2 |
  
-Par contre, si root inscrit le nom d'un utilisateur dans /etc/cron.deny et cet utilisateur a déjà planifié des tâches avec son propre fichier crontab, les tâches seront exécutées. Pour détruire les tâches planifiées de l'utilisateur, il faut détruire le fichier crontab de l'utilisateur.+Comparez les deux nombres **value1** et **value2** :
  
-=====LAB #2 - anacron=====+<code> 
 +[trainee@redhat9 training]$ read value1 
 +35
  
-L'inconvénient avec crond est qu'afin que celui-ci puisse exécuter des tâches automatiquement, la machine doit rester allumée en permanence.+[trainee@redhat9 training]$ read value2 
 +23
  
-Il existe un alternatif très efficace pour des machines qui ne sont pas constamment allumée. Cette solution est le logiciel Anacron. Sous RHEL/CentOS, l'utilisation d'anacron **remplace** l'utilisation de cron pour les tâches système.+[trainee@redhat9 training]$ [ $value1 -lt $value2 ]
  
-====2.- Le Fichier /etc/anacrontab====+[trainee@redhat9 training]$ echo $? 
 +1
  
-Ouvrez donc le fichier /etc/anacrontab :+[trainee@redhat9 training]$ [ $value2 -lt $value1 ] 
 + 
 +[trainee@redhat9 training]$ echo $? 
 +
 + 
 +[trainee@redhat9 training]$ [ $value2 -eq $value1 ] 
 + 
 +[trainee@redhat9 training]$ echo $? 
 +
 +</code> 
 + 
 +===Les opérateurs=== 
 + 
 +^ Test ^ Description ^ 
 +| !expression | Retourne vrai si expression est fausse | 
 +| expression1 -a expression2 | Représente un et logique entre expression1 et expression2 | 
 +| expression1 -o expression2 | Représente un ou logique entre expression1 et expression2 | 
 +| \(expression\) | Les parenthèses permettent de regrouper des expressions 
 + 
 +Testez si $file n'est pas un répertoire :
  
 <code> <code>
-[root@centos8 ~]# cat /etc/anacrontab +[trainee@redhat9 training]file=a1OO
-# /etc/anacrontab: configuration file for anacron+
  
-# See anacron(8) and anacrontab(5) for details.+[trainee@redhat9 training]$ [ ! -d $file ]
  
-SHELL=/bin/sh +[trainee@redhat9 training]$ echo $? 
-PATH=/sbin:/bin:/usr/sbin:/usr/bin +
-MAILTO=root +</code> 
-# the maximal random delay added to the base delay of the jobs + 
-RANDOM_DELAY=45 +Testez si $directory est un répertoire **et** si l'utilisateur à le droit de le traverser 
-# the jobs will be started during the following hours only + 
-START_HOURS_RANGE=3-22+<code> 
 +[trainee@redhat9 training]$ directory=/usr 
 + 
 +[trainee@redhat9 training]$ [ -d $directory -a -x $directory ]
  
-#period in days   delay in minutes   job-identifier   command +[trainee@redhat9 training]$ echo $? 
-1 5 cron.daily nice run-parts /etc/cron.daily +0
-7 25 cron.weekly nice run-parts /etc/cron.weekly +
-@monthly 45 cron.monthly nice run-parts /etc/cron.monthly+
 </code> </code>
  
-Vous noterez que ce fichier fait référence aux répertoires **/etc/cron.daily**, **/etc/cron.weekly** et **/etc/cron.monthly**.+Testez si l'utilisateur peut écrire dans le fichier a100 **et** /usr est un répertoire **ou** /tmp est un répertoire :
  
-====2.2 Les Champs Temporels====+<code> 
 +[trainee@redhat9 training]$ [ -w a100 -a \( -d /usr -o -d /tmp \) ]
  
-Les deux premiers champs sont des champs temporels. Dans le cas d'anacron ceux-ci correspondent à:+[trainee@redhat9 training]$ echo $? 
 +
 +</code>
  
-^ Période ^ Délai ^ +===Tests d'environnement utilisateur===
-| La périodicité en jours | Le délai en minutes, après le **démarrage d'anacron** et avant l'exécution des tâches dans le répertoire concerné |+
  
-Anacron mémorise dans les fichiers qui se trouvent dans **/var/spool/anacron/** la date à laquelle il a exécuté les commandes qui se trouvent dans anacrontab pour la dernière fois. Ces fichiers sont appelés cron.daily, cron.weekly et cron.monthly.+^ Test ^ Description ^ 
 +| -o option | Retourne vrai si l'option du shell "option" est activée |
  
 <code> <code>
-[root@centos8 ~]# ls /var/spool/anacron/ +[trainee@redhat9 training]-o allexport 
-cron.daily  cron.monthly  cron.weekly + 
-[root@centos8 ~]# cat /var/spool/anacron/cron.daily  +[trainee@redhat9 training]$ echo $? 
-20210602 +1
-[root@centos8 ~]# cat /var/spool/anacron/cron.weekly +
-20210602 +
-[root@centos8 ~]# cat /var/spool/anacron/cron.monthly +
-20210526+
 </code> </code>
  
-====2.Le Fichier /var/spool/anacron/cron.daily====+====1.La commande [[ expression ]]====
  
-Sous RHEL/CentOS, anacron consulte le fichier **/var/spool/anacron/cron.daily** chaque heure grâce à l'exécution du script **/etc/cron.hourly/0anacron** et, en fonction de la date inscrite dans le fichier et la date du jour, décide si oui ou non s'il doit exécuter la ligne de commande.+La commande **%%[[%%<key>espace</key>expression<key>espace</key>%%]]%%** est une amélioration de la commande **test**. Les opérateurs de la commande test sont compatibles avec la commande %%[[ expression ]]%% sauf **-a** et **-o** qui sont remplacés par **&&** et **%%||%%** respectivement :
  
-Voici le script **/etc/cron.hourly/0anacron** :+^ Test ^ Description ^ 
 +| !expression | Retourne vrai si expression est fausse | 
 +| expression1 %%&&%% expression2 | Représente un **et** logique entre expression1 et expression2 | 
 +| expression1 %%||%% expression2 | Représente un **ou** logique entre expression1 et expression2 | 
 +| %%(expression)%% | Les parenthèses permettent de regrouper des expressions  |  
 + 
 +D'autres opérateurs ont été ajoutés : 
 + 
 +^ Test ^ Description ^ 
 +| string = modele | Retourne vrai si chaîne correspond au modèle | 
 +| string != modele | Retourne vrai si chaîne ne correspond pas au modèle | 
 +| string1 < string2 | Retourne vrai si string1 est lexicographiquement avant string2 | 
 +| string1 > string2 | Retourne vrai si string1 est lexicographiquement après string2 
 + 
 +Testez si l'utilisateur peut écrire dans le fichier a100 **et** /usr est un répertoire **ou** /tmp est un répertoire :
  
 <code> <code>
-[root@centos8 ~]# cat /etc/cron.hourly/0anacron +[trainee@redhat9 training]$ [[ -w a100 && ( -d /usr || -/tmp ) ]]
-#!/bin/sh +
-# Check whether 0anacron was run today already +
-if test -/var/spool/anacron/cron.daily; then +
-    day=`cat /var/spool/anacron/cron.daily` +
-fi +
-if [ `date +%Y%m%d` = "$day" ]; then +
-    exit 0 +
-fi+
  
-# Do not run jobs when on battery power +[trainee@redhat9 training]$ echo $? 
-online=1 +0 
-for psupply in AC ADP0 ; do +</code>
-    sysfile="/sys/class/power_supply/$psupply/online"+
  
-    if [ -f $sysfile ] ; then +====1.5 - Opérateurs du shell==== 
-        if [ `cat $sysfile 2>/dev/null`x 1x ]; then + 
-            online=1 +^ Opérateur ^ Description ^ 
-            break +| Commande1 %%&&%% Commande2 | Commande 2 est exécutée si la première commande renvoie un code vrai | 
-        else +| Commande1 %%||%% Commande2 | Commande 2 est exécutée si la première commande renvoie un code faux | 
-            online=0 + 
-        fi +<code> 
-    fi +[trainee@redhat9 training][[ -d /root ]&& echo "The root directory exists" 
-done +The root directory exists 
-if [ $online = 0 ]; then + 
-    exit 0 +[trainee@redhat9 training]$ [[ -d /root ]] || echo "The root directory exists" 
-fi + 
-/usr/sbin/anacron -s+[trainee@redhat9 training]$  
 </code> </code>
  
-Ce script a pour but d'exécuter la commande **/usr/sbin/anacron -s**. L'option **-s** indique à anacron d'attendre la fin d'exécution d'un job avant d'exécuter le suivant.+====1.6 - L'arithmétique====
  
-=====LAB #3 - at=====+===La commande expr===
  
-Tout comme avec la commande cron, root a la possibilité d'accorder ou d'interdire aux utilisateurs le droit d'exécuter des tâches avec at en utilisant les deux fichiers suivants :+La commande **expr** prend la forme :
  
-  * **/etc/at.allow** +expr <key>espace</key> value1 <key>espace</key> //opérateur// <key>espace</key> value2 <key>entrée</key>
-  * **/etc/at.deny**+
  
-Si le fichier at.allow existe, seuls les utilisateurs dans ce fichier pourront exécuter at.+ou
  
-En tant que root, mettez en place maintenant deux tâches pour le 31/12/2042 à 13h00 et 14h00 respectivement :+expr <key>tab</key> value1 <key>tab</key> //opérateur// <key>tab</key> value2 <key>entrée</key> 
 + 
 +ou 
 + 
 +expr <key>espace</key> chaîne <key>espace</key> : <key>espace</key> //expression_régulière// <key>entrée</key> 
 + 
 +ou  
 + 
 +expr <key>tab</key> chaîne <key>tab</key> : <key>tab</key> //expression_régulière// <key>entrée</key> 
 + 
 +==Opérateurs Arithmétiques== 
 + 
 +^ Opérateur ^ Description ^ 
 +| + | Addition | 
 +| - | Soustraction | 
 +| \* | Multiplication | 
 +| / | Division | 
 +| % | Modulo | 
 +| \( \) | Parenthèses | 
 + 
 +==Opérateurs de Comparaison== 
 + 
 +^ Opérateur ^ Description ^ 
 +| \< | Inférieur | 
 +| %%\<=%% | Inférieur ou égal | 
 +| \> | Supérieur | 
 +| \>= | Supérieur ou égal | 
 +| = | égal | 
 +| != | inégal | 
 + 
 +==Opérateurs Logiques== 
 + 
 +^ Opérateur ^ Description ^ 
 +| %%\|%% | ou logique | 
 +| \& | et logique | 
 + 
 +Ajoutez 2 à la valeur de $x :
  
 <code> <code>
-[root@centos8 ~]# at 13:00 12/31/2042 +[trainee@redhat9 training]$ x=2
-warning: commands will be executed using /bin/sh +
-at> pwd > /tmp/test13.atd +
-at> <EOT> +
-job 1 at Wed Dec 31 13:00:00 2042+
  
-[root@centos8 ~]# at 14:00 12/31/2042 +[trainee@redhat9 training]$ expr $x + 2 
-warning: commands will be executed using /bin/sh +4
-at> free > /tmp/test14.atd +
-at> <EOT> +
-job 2 at Wed Dec 31 14:00:00 2042+
 </code> </code>
  
-====3.1 - Le Répertoire /var/spool/at/====+Si les espaces sont retirés, le résultat est tout autre :
  
-Sous RHEL/CentOS, les fichiers concernant ces deux tâches sont stockés dans le répertoire **/var/spool/at/** :+<code> 
 +[trainee@redhat9 training]$ expr $x+2 
 +2+2 
 +</code> 
 + 
 +Les opérateurs doivent être protégés :
  
 <code> <code>
-[root@centos8 ~]# ls /var/spool/at +[trainee@redhat9 training]$ expr $x * 2 
-a000010249d9f8  a000020249da34  spool+expr: syntax error 
 + 
 +[trainee@redhat9 training]$ expr $x \* 2 
 +4
 </code> </code>
  
-A l'examen du deuxième fichier, vous constaterez un résultat similaire à celui-ci :+Mettez le résultat d'un calcul dans une variable :
  
 <code> <code>
-[root@centos8 ~]# at -c 2 +[trainee@redhat9 training]$ resultat=`expr $x + 10` 
-#!/bin/sh + 
-# atrun uid=0 gid=0 +[trainee@redhat9 training]echo $resultat 
-# mail trainee 0 +12
-umask 22 +
-LS_COLORS=rs=0:di=38\;5\;33:ln=38\;5\;51:mh=00:pi=40\;38\;5\;11:so=38\;5\;13:do=38\;5\;5:bd=48\;5\;232\;38\;5\;11:cd=48\;5\;232\;38\;5\;3:or=48\;5\;232\;38\;5\;9:mi=01\;05\;37\;41:su=48\;5\;196\;38\;5\;15:sg=48\;5\;11\;38\;5\;16:ca=48\;5\;196\;38\;5\;226:tw=48\;5\;10\;38\;5\;16:ow=48\;5\;10\;38\;5\;21:st=48\;5\;21\;38\;5\;15:ex=38\;5\;40:\*.tar=38\;5\;9:\*.tgz=38\;5\;9:\*.arc=38\;5\;9:\*.arj=38\;5\;9:\*.taz=38\;5\;9:\*.lha=38\;5\;9:\*.lz4=38\;5\;9:\*.lzh=38\;5\;9:\*.lzma=38\;5\;9:\*.tlz=38\;5\;9:\*.txz=38\;5\;9:\*.tzo=38\;5\;9:\*.t7z=38\;5\;9:\*.zip=38\;5\;9:\*.z=38\;5\;9:\*.dz=38\;5\;9:\*.gz=38\;5\;9:\*.lrz=38\;5\;9:\*.lz=38\;5\;9:\*.lzo=38\;5\;9:\*.xz=38\;5\;9:\*.zst=38\;5\;9:\*.tzst=38\;5\;9:\*.bz2=38\;5\;9:\*.bz=38\;5\;9:\*.tbz=38\;5\;9:\*.tbz2=38\;5\;9:\*.tz=38\;5\;9:\*.deb=38\;5\;9:\*.rpm=38\;5\;9:\*.jar=38\;5\;9:\*.war=38\;5\;9:\*.ear=38\;5\;9:\*.sar=38\;5\;9:\*.rar=38\;5\;9:\*.alz=38\;5\;9:\*.ace=38\;5\;9:\*.zoo=38\;5\;9:\*.cpio=38\;5\;9:\*.7z=38\;5\;9:\*.rz=38\;5\;9:\*.cab=38\;5\;9:\*.wim=38\;5\;9:\*.swm=38\;5\;9:\*.dwm=38\;5\;9:\*.esd=38\;5\;9:\*.jpg=38\;5\;13:\*.jpeg=38\;5\;13:\*.mjpg=38\;5\;13:\*.mjpeg=38\;5\;13:\*.gif=38\;5\;13:\*.bmp=38\;5\;13:\*.pbm=38\;5\;13:\*.pgm=38\;5\;13:\*.ppm=38\;5\;13:\*.tga=38\;5\;13:\*.xbm=38\;5\;13:\*.xpm=38\;5\;13:\*.tif=38\;5\;13:\*.tiff=38\;5\;13:\*.png=38\;5\;13:\*.svg=38\;5\;13:\*.svgz=38\;5\;13:\*.mng=38\;5\;13:\*.pcx=38\;5\;13:\*.mov=38\;5\;13:\*.mpg=38\;5\;13:\*.mpeg=38\;5\;13:\*.m2v=38\;5\;13:\*.mkv=38\;5\;13:\*.webm=38\;5\;13:\*.ogm=38\;5\;13:\*.mp4=38\;5\;13:\*.m4v=38\;5\;13:\*.mp4v=38\;5\;13:\*.vob=38\;5\;13:\*.qt=38\;5\;13:\*.nuv=38\;5\;13:\*.wmv=38\;5\;13:\*.asf=38\;5\;13:\*.rm=38\;5\;13:\*.rmvb=38\;5\;13:\*.flc=38\;5\;13:\*.avi=38\;5\;13:\*.fli=38\;5\;13:\*.flv=38\;5\;13:\*.gl=38\;5\;13:\*.dl=38\;5\;13:\*.xcf=38\;5\;13:\*.xwd=38\;5\;13:\*.yuv=38\;5\;13:\*.cgm=38\;5\;13:\*.emf=38\;5\;13:\*.ogv=38\;5\;13:\*.ogx=38\;5\;13:\*.aac=38\;5\;45:\*.au=38\;5\;45:\*.flac=38\;5\;45:\*.m4a=38\;5\;45:\*.mid=38\;5\;45:\*.midi=38\;5\;45:\*.mka=38\;5\;45:\*.mp3=38\;5\;45:\*.mpc=38\;5\;45:\*.ogg=38\;5\;45:\*.ra=38\;5\;45:\*.wav=38\;5\;45:\*.oga=38\;5\;45:\*.opus=38\;5\;45:\*.spx=38\;5\;45:\*.xspf=38\;5\;45:; export LS_COLORS +
-LANG=en_US.UTF-8; export LANG +
-HISTCONTROL=ignoredups; export HISTCONTROL +
-GUESTFISH_RESTORE=\\e[0m; export GUESTFISH_RESTORE +
-HOSTNAME=centos8.ittraining.loc; export HOSTNAME +
-GUESTFISH_INIT=\\e[1\;34m; export GUESTFISH_INIT +
-USER=root; export USER +
-GUESTFISH_PS1=\\[\\e[1\;32m\\]\>\<fs\>\\[\\e[0\;31m\\]\ ; export GUESTFISH_PS1 +
-PWD=/root; export PWD +
-HOME=/root; export HOME +
-MAIL=/var/spool/mail/root; export MAIL +
-SHELL=/bin/bash; export SHELL +
-SHLVL=1; export SHLVL +
-LOGNAME=root; export LOGNAME +
-PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin; export PATH +
-GUESTFISH_OUTPUT=\\e[0m; export GUESTFISH_OUTPUT +
-HISTSIZE=1000; export HISTSIZE +
-LESSOPEN=\|\|/usr/bin/lesspipe.sh\ %s; export LESSOPEN +
-cd /root || { +
-  echo 'Execution directory inaccessible' >&+
- exit 1 +
-+
-${SHELL:-/bin/sh} << 'marcinDELIMITER4c5fdfe0' +
-free > /tmp/test14.atd +
-marcinDELIMITER4c5fdfe0+
 </code> </code>
  
-Pour supprimer cette tâche il convient d'utiliser la commande **atrm** ou **at -d** :+===La commande let === 
 + 
 +La commande let est l'équivalent de la commande %%((expression))%%. La commande %%((expression))%% est une amélioration de la commande **expr** 
 + 
 +  * plus grand nombre d'opérateurs 
 +  * pas besoin d'espaces ou de tabulations entre les arguments 
 +  pas besoin de préfixer les variables d'un $ 
 +  les caractères spéciaux du shell n'ont pas besoin d'être protégés 
 +  les affectations se font dans la commande 
 +  exécution plus rapide 
 + 
 +==Opérateurs Arithmétiques== 
 + 
 +^ Opérateur ^ Description ^ 
 +| + | Addition | 
 +| - | Soustraction | 
 +| * | Multiplication | 
 +| / | Division | 
 +| % | Modulo | 
 +| %%^%% | Puissance | 
 + 
 +==Opérateurs de comparaison== 
 + 
 +^ Opérateur ^ Description ^ 
 +| < | Inférieur | 
 +| %%<=%% | Inférieur ou égal | 
 +| > | Supérieur | 
 +| >= | Supérieur ou égal | 
 +| == | égal | 
 +| != | inégal | 
 + 
 +==Opérateurs Logiques== 
 + 
 +^ Opérateur ^ Description ^ 
 +| && | et logique | 
 +| %%||%% | ou logique | 
 +| ! | négation logique | 
 + 
 +==Opérateurs travaillant sur les bits== 
 + 
 +^ Opérateur ^ Description ^ 
 +| ~ | négation binaire | 
 +| %%>>%% | décalage binaire à droite | 
 +| %%<<%% | décalage binaire à gauche| 
 +| & | et binaire | 
 +| %%|%% | ou binaire | 
 +| %%^%% | ou exclusif binaire |
  
 <code> <code>
-[root@centos8 ~]# at -l +[trainee@redhat9 training]$ x=2 
-1 Wed Dec 31 13:00:00 2042 a root + 
-2 Wed Dec 31 14:00:00 2042 a root +[trainee@redhat9 training]$ ((x=$x+10)) 
-[root@centos8 ~]# atq + 
-1 Wed Dec 31 13:00:00 2042 a root +[trainee@redhat9 training]$ echo $x 
-2 Wed Dec 31 14:00:00 2042 a root +12 
-[root@centos8 ~]# at -d 2 + 
-[root@centos8 ~]# atq +[trainee@redhat9 training]$ ((x=$x+20)) 
-1 Wed Dec 31 13:00:00 2042 a root+ 
 +[trainee@redhat9 training]$ echo $x 
 +32
 </code> </code>
  
-Finalement, pour exécuter plusieurs commandes à la même heure d'une manière séquentielle, vous pouvez les insérer dans un fichier :+====1.7 - Structures de contrôle==== 
 + 
 +===If=== 
 + 
 +La syntaxe de la commande If est la suivante : 
 + 
 +<file> 
 +if condition 
 +then 
 +    commande(s) 
 +else  
 +    commande(s) 
 +fi 
 +</file> 
 + 
 +ou : 
 + 
 +<file> 
 +if condition 
 +then 
 +    commande(s) 
 +    commande(s) 
 +fi 
 +</file> 
 + 
 +ou encore : 
 + 
 +<file> 
 +if condition 
 +then 
 +     commande(s) 
 +elif condition 
 +then 
 +     commande(s) 
 +elif condition 
 +then 
 +     commande(s) 
 +else  
 +    commande(s) 
 + 
 +fi 
 +</file> 
 + 
 +Créez le script **user_check** suivant :
  
 <code> <code>
-[root@centos8 ~]# touch todo.list +[trainee@redhat9 training]$ vi user_check 
-[root@centos8 ~]# echo pwd > todo.list +[trainee@redhat9 training]$ cat user_check 
-[root@centos8 ~]echo free >> todo.list +#!/bin/bash 
-[root@centos8 ~]# echo who >> todo.list +if $# -ne 1 ; then 
-[root@centos8 ~]# cat todo.list +  echo "Mauvais nombre d'arguments" 
-pwd +  echo "Usage : $0 nom_utilisateur" 
-free +  exit 1 
-who+fi 
 +if grep "^$1:" /etc/passwd /dev/null 
 +then 
 +  echo "Utilisateur $1 est défini sur ce système" 
 +else 
 +  echo "Utilisateur $1 n'est pas défini sur ce système" 
 +fi 
 +exit 0 
 +</code>
  
-[root@centos8 ~]# at 14:30 12/31/2042 < todo.list +Testez-le : 
-warningcommands will be executed using /bin/sh + 
-job 3 at Wed Dec 31 14:30:00 2042+<code> 
 +[trainee@redhat9 training]$ chmod 770 user_check 
 + 
 +[trainee@redhat9 training]$ ./user_check 
 +Mauvais nombre d'arguments 
 +Usage ./user_check nom_utilisateur 
 + 
 +[trainee@redhat9 training]$ ./user_check root 
 +Utilisateur root est défini sur ce système 
 + 
 +[trainee@redhat9 training]$ ./user_check mickey mouse 
 +Mauvais nombre d'arguments 
 +Usage ./user_check nom_utilisateur 
 + 
 +[trainee@redhat9 training]$ ./user_check "mickey mouse" 
 +Utilisateur mickey mouse n'est pas défini sur ce système 
 +</code> 
 + 
 +===case=== 
 + 
 +La syntaxe de la commande case est la suivante : 
 + 
 +<file> 
 +case $variable in 
 +modele1) commande 
 +   ... 
 +   ;; 
 +modele2) commande 
 +   ... 
 +   ;; 
 +modele3 | modele4 | modele5 ) commande 
 +   ... 
 +   ;; 
 +esac 
 +</file> 
 + 
 +==Exemple== 
 + 
 +<code> 
 +  case "$1" in 
 +      start) 
 +          start 
 +          ;; 
 +      stop) 
 +          stop 
 +          ;; 
 +      restart|reload) 
 +          stop 
 +          start 
 +          ;; 
 +      status) 
 +          status 
 +          ;; 
 +      *) 
 +          echo $"Usage$0 {start|stop|restart|status}" 
 +          exit 1 
 +esac
 </code> </code>
  
 <WRAP center round important 60%> <WRAP center round important 60%>
-**Important** - La commande **batch** ou son alias **at -b** est utilisée pour exécuter des commandes au moment où la charge sur le système est en dessous un certain niveauPar défaut la valeur est fixée à **1.5**. Cette valeur peut être modifiée par l'option **-l** da la commande **atd**.+**Important** : L'exemple indique que dans le cas où le premier argument qui suit le nom du script contenant la clause **case** est **start**la fonction //start// sera exécutée. La fonction //start// n'a pas besoin d'être définie dans **case** et est donc en règle générale définie en début de scriptLa même logique est appliquée dans le cas où le premier argument est **stop**, **restart** ou **reload** et **status**. Dans tous les autres cas, représentés par une étoile, **case** affichera la ligne **Usage: $0 {start|stop|restart|status}** où $0 est remplacé par le nom du script.
 </WRAP> </WRAP>
 +
 +====1.8 - Boucles====
 +
 +===for===
 +
 +La syntaxe de la commande for est la suivante :
 +
 +<file>
 +for variable in liste_variables
 +do
 +    commande(s)
 +done
 +</file>
 +
 +
 +===while===
 +
 +La syntaxe de la commande while est la suivante :
 +
 +<file>
 +while condition
 +do
 +    commande(s)
 +done
 +</file>
 +
 +==Exemple==
 +
 +<file>
 +U=1
 +while [ $U -lt $MAX_ACCOUNTS ]
 +do
 +useradd fenestros"$U" -c fenestros"$U" -d /home/fenestros"$U" -g staff -G audio,fuse -s /bin/bash 2>/dev/null
 +useradd fenestros"$U"$ -g machines -s /dev/false -d /dev/null 2>/dev/null
 +echo "Compte fenestros$U créé"
 +let U=U+1
 +done
 +</file>
 +
 +====1.9 - Scripts de Démarrage====
 +
 +Quand Bash est appelé en tant que shell de connexion, il exécute des scripts de démarrage dans l'ordre suivant :
 +
 +  * **/etc/profile**,
 +  * **~/.bash_profile** ou **~/.bash_login** ou **~/.profile** selon la distribution,
 +
 +Dans le cas de RHEL 9, le système exécute le fichier **~/.bash_profile**.
 +
 +Quand un shell de login se termine, Bash exécute le fichier **~/.bash_logout** si celui-ci existe.
 +
 +Quand bash est appelé en tant que shell interactif qui n'est pas un shell de connexion, il exécute le script **~/.bashrc**.
 +
 +<WRAP center round important 60%>
 +**A faire** : En utilisant vos connaissances acquises dans ce module, expliquez les scripts suivants ligne par ligne. 
 +</WRAP>
 +
 +===~/.bash_profile===
 +
 +<code>
 +[trainee@redhat9 training]$ cat ~/.bash_profile
 +# .bash_profile
 +
 +# Get the aliases and functions
 +if [ -f ~/.bashrc ]; then
 +        . ~/.bashrc
 +fi
 +
 +# User specific environment and startup programs
 +</code>
 +
 +===~/.bashrc===
 +
 +<code>
 +[trainee@redhat9 training]$ cat ~/.bashrc
 +# .bashrc
 +
 +# Source global definitions
 +if [ -f /etc/bashrc ]; then
 +        . /etc/bashrc
 +fi
 +
 +# User specific environment
 +if ! [[ "$PATH" =~ "$HOME/.local/bin:$HOME/bin:" ]]
 +then
 +    PATH="$HOME/.local/bin:$HOME/bin:$PATH"
 +fi
 +export PATH
 +
 +# Uncomment the following line if you don't like systemctl's auto-paging feature:
 +# export SYSTEMD_PAGER=
 +
 +# User specific aliases and functions
 +if [ -d ~/.bashrc.d ]; then
 +        for rc in ~/.bashrc.d/*; do
 +                if [ -f "$rc" ]; then
 +                        . "$rc"
 +                fi
 +        done
 +fi
 +
 +unset rc
 +</code>
 +
 +====1.10 - Rappel des Expressions Régulières dans Bash====
 +
 +^ Option ^ Description ^
 +| %%^%% | Trouver la chaîne au début de la ligne |
 +| $ | Trouver la chaîne à la fin de la ligne |
 +| \ | Annuler l'effet spécial du caractère suivant |
 +| [ ] | Trouver n'importe quel des caractères entre les crochets |
 +| [%%^%%] | Exclure les caractères entre crochets |
 +| . | Trouver n'importe quel caractère sauf à la fin de la ligne |
 +| * | Trouver 0 ou plus du caractère qui précède |
 +| \< | Trouver la chaîne au début d'un mot |
 +| \> | Trouver la chaîne à la fin d'un mot |
 +| ? | Trouver 0 ou 1 occurrence de ce qui précède |
 +| + | Trouver 1 ou **n** d'occurrences de ce qui précède |
 +| {x,y} | Trouver de **x** à **y** occurrences de ce qui précède |
 +| {x} | Trouver exactement le nombre **x** d'occurrences de ce qui précède |
 +| {x,} | Trouver le nombre **x** ou plus d'occurrences de ce qui précède |
 +| {,x} | Trouver le nombre **x** ou moins d'occurrences de ce qui précède |
 +| () | Faire un **ET** des expressions régulières entre les paranthèses |
 +| %%|%% | Faire un **OU** des expressions régulières se trouvant de chaque côté du pipe |
 +| [:alnum:] | Caractères alphanumériques : [:alpha :] et [:digit :]; dans la locale 'C' et le codage de caractères ASCII, cette expression est identique à [0-9A-Za-z]. |
 +| [:alpha:] | Caractères alphabétiques : [:lower :] et [:upper :]; dans les paramètres régionaux 'C' et le codage de caractères ASCII, cette expression est identique à [A-Za-z]. |
 +| [:blank:] | Caractères vides : espace et tabulation. |
 +| [:cntrl:] | Caractères de contrôle. En ASCII, ces caractères ont les codes octaux 000 à 037, et 177 (DEL). |
 +| [:digit:] | Chiffres : 0 1 2 3 4 5 6 7 8 9. |
 +| [:graph:] | Caractères graphiques : [:alnum :] et [:punct :]. |
 +| [:lower:] | Lettres minuscules ; dans la locale « C » et le codage de caractères ASCII : a b c d e f g h i j k l m n o p q r s t u v w x y z. |
 +| [:print:] | Caractères imprimables : [:alnum :], [:punct :] et espace. |
 +| [:punct:] | Caractères de ponctuation ; dans les paramètres régionaux « C » et le codage des caractères ASCII : %% ! «  # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ' { | } ~. %% |
 +| [:space:] | Caractères d'espacement : dans les paramètres régionaux « C », il s'agit de la tabulation, de la nouvelle ligne, de la tabulation verticale, du saut de page, du retour chariot et de l'espacement. |
 +| [:upper:] | Lettres majuscules : dans les paramètres régionaux « C » et le codage des caractères ASCII : A B C D E F G H I J K L M N O P Q R S T U V W X Y Z. |
 +| [:xdigit:] | Chiffres hexadécimaux : 0 1 2 3 4 5 6 7 8 9 A B C D E F a b c d e f. |
 +| \b | Faire correspondre la chaîne vide au bord d'un mot. |
 +| \B | Correspondre à la chaîne vide à condition qu'elle ne se trouve pas à la périphérie d'un mot. |
 +| \< | Correspondre à la chaîne vide au début d'un mot. |
 +| \> | Correspondre à la chaîne vide à la fin d'un mot. |
 +| \w | Correspondre au mot constituant. Synonyme de [_[:alnum :]]. |
 +| \W | Correspondre à un constituant non-mot. Synonyme de %%[^_[:alnum :]].%% |
 +| \s | %%Correspondre à l'espace blanc. Synonyme de '[[:espace :]`].%% |
 +| \S | %%Correspondre à un espace non blanc. Synonyme de [^[:espace :]].%% |
  
 ----- -----
 Copyright © 2024 Hugh Norris. Copyright © 2024 Hugh Norris.
 +
Menu