Différences
Ci-dessous, les différences entre deux révisions de la page.
Prochaine révision | Révision précédente | ||
elearning:workbooks:redhat:rh134:l100 [2024/09/26 13:22] – created admin | elearning: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 | + | ======RH13401 |
=====Contenu du Module===== | =====Contenu du Module===== | ||
- | * **LCF505 | + | * **RH13401 |
* Contenu du Module | * Contenu du Module | ||
- | * LAB #1 - cron | + | * LAB #1 - Les Scripts Shell |
- | * 1.1 - Le Fichier / | + | * 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.1 - Le Fichier / | + | * 1.3 - La commande test |
- | * 2.2 - Les Champs Temporels | + | * Tests de Fichiers |
- | * 2.3 - Le Fichier / | + | * Tests de chaînes de caractère |
- | * LAB #3 - at | + | * Tests sur des nombres |
- | * 3.1 - Le Répertoire | + | * Les opérateurs |
+ | * Tests d' | ||
+ | * 1.4 - La commande %%[[ expression ]]%% | ||
+ | * 1.5 - Opérateurs du shell | ||
+ | * 1.6 - L' | ||
+ | * 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' | ||
+ | |||
+ | ==== 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' | ||
+ | |||
+ | **/bin/bash myscript** | ||
+ | |||
+ | soit en redirigeant son entrée standard : | ||
+ | |||
+ | **/bin/bash < myscript** | ||
+ | |||
+ | Dans le cas où le droit d' | ||
+ | |||
+ | **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 : | ||
+ | |||
+ | **./ | ||
+ | |||
+ | Dans le cas où le script doit être exécuté par le shell courant, dans les mêmes conditions que l' | ||
+ | |||
+ | **. myscript** | ||
+ | |||
+ | Dans un script il est fortement conseillé d' | ||
+ | |||
+ | 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' | ||
+ | |||
+ | #!/bin/sh | ||
+ | |||
+ | Puisque un script contient des lignes de commandes qui peuvent être saisies en shell intéractif, | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 ~]$ script | ||
+ | Script started, output log file is ' | ||
+ | |||
+ | [trainee@redhat9 ~]$ pwd | ||
+ | / | ||
+ | |||
+ | [trainee@redhat9 ~]$ ls | ||
+ | Desktop | ||
+ | |||
+ | [trainee@redhat9 ~]$ exit | ||
+ | exit | ||
+ | Script done. | ||
+ | |||
+ | [trainee@redhat9 ~]$ cat typescript | ||
+ | Script started on 2024-10-21 11: | ||
+ | [trainee@redhat9 ~]$ pwd | ||
+ | / | ||
+ | [trainee@redhat9 ~]$ ls | ||
+ | Desktop | ||
+ | [trainee@redhat9 ~]$ exit | ||
+ | exit | ||
+ | |||
+ | Script done on 2024-10-21 11: | ||
+ | </ | ||
+ | |||
+ | Cette procédure peut être utilisée pour enregistrer une suite de commandes longues et compliquées afin d' | ||
+ | |||
+ | Pour illustrer l' | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 ~]$ vi myscript | ||
+ | [trainee@redhat9 ~]$ cat myscript | ||
+ | pwd | ||
+ | ls | ||
+ | </ | ||
+ | |||
+ | Sauvegardez votre fichier. Lancez ensuite votre script en passant le nom du fichier en argument à /bin/bash : | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 ~]$ /bin/bash myscript | ||
+ | / | ||
+ | Desktop | ||
+ | Documents | ||
+ | </ | ||
+ | |||
+ | Lancez ensuite le script en redirigeant son entrée standard : | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 ~]$ /bin/bash < myscript | ||
+ | / | ||
+ | Desktop | ||
+ | Documents | ||
+ | </ | ||
+ | |||
+ | Pour lancer le script en l' | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 ~]$ echo $PATH | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | Dans le cas de RHEL 9, même si PATH contient $HOME/bin, le répertoire n' | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 ~]$ ls | ||
+ | Desktop | ||
+ | Documents | ||
+ | </ | ||
+ | |||
+ | Créez donc ce répertoire : | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 ~]$ mkdir bin | ||
+ | </ | ||
+ | |||
+ | Ensuite déplacez votre script dans ce répertoire et rendez-le exécutable pour votre utilisateur : | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 ~]$ mv myscript ~/bin | ||
+ | [trainee@redhat9 ~]$ chmod u+x ~/ | ||
+ | </ | ||
+ | |||
+ | Exécutez maintenant votre script en l' | ||
+ | |||
+ | < | ||
+ | [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 | ||
+ | </ | ||
+ | |||
+ | Placez-vous dans le répertoire contenant le script et saisissez les commandes suivantes : | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 tmp]$ cd ~/bin | ||
+ | |||
+ | [trainee@redhat9 bin]$ ./ | ||
+ | / | ||
+ | myscript | ||
+ | |||
+ | [trainee@redhat9 bin]$ . myscript | ||
+ | / | ||
+ | myscript | ||
+ | </ | ||
+ | |||
+ | ====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' | ||
+ | |||
+ | < | ||
+ | [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! | ||
+ | </ | ||
<WRAP center round important 60%> | <WRAP center round important 60%> | ||
- | **Important** : Le service crond présume | + | **Important**: |
</ | </ | ||
- | 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. | + | < |
+ | [trainee@redhat9 bin]$ read var1 var2 | ||
+ | fenestros edu is great! | ||
- | Le service crond lit toutes les minutes le fichier **/ | + | [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! | ||
+ | </ | ||
- | L' | + | <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**. | ||
+ | </ | ||
- | Sous RHEL/ | + | ===Code |
- | ====1.1 | + | La commande **read** renvoie un code de retour de **0** dans le cas où elle ne reçoit pas l' |
- | Sous RHEL/CentOS le fichier | + | < |
+ | [trainee@redhat9 bin]$ read var | ||
+ | </code> | ||
+ | < | ||
+ | < | ||
+ | [trainee@redhat9 bin]$ echo $? | ||
+ | 0 | ||
+ | [trainee@redhat9 bin]$ echo $var | ||
+ | [trainee@redhat9 bin]$ | ||
+ | </ | ||
+ | |||
+ | Le contenu de la variable **var1** peut être vide et la valeur du code de retour **autre que 0** grâce à l' | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 bin]$ read var | ||
+ | </ | ||
+ | < | ||
< | < | ||
- | [root@centos8 ~]# cat / | ||
- | SHELL=/ | ||
- | PATH=/ | ||
- | MAILTO=root | ||
- | # For details see man 4 crontabs | + | [trainee@redhat9 bin]$ echo $? |
+ | 0 | ||
+ | [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 ... | + | </ |
- | # | | + | |
- | # | | | | | | + | ===La variable IFS=== |
- | # * * * * * user-name | + | |
+ | La variable IFS contient par défaut les caractères < | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 bin]$ echo " | ||
+ | 0000000 | ||
+ | 0000004 | ||
</ | </ | ||
<WRAP center round important 60%> | <WRAP center round important 60%> | ||
- | **Important** | + | **Important** |
</ | </ | ||
- | ====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 / | + | < |
+ | [trainee@redhat9 bin]$ IFS=":" | ||
- | Les 5 champs sont : | + | [trainee@redhat9 bin]$ echo " |
+ | 0000000 | ||
+ | 0000002 | ||
+ | </ | ||
- | ^ Minutes ^ Heures ^ Jour du mois ^ Mois de l'année ^ Jour de la sem. ^ | + | De cette façon |
- | | (0-59) | + | |
- | * le 0 correspond à dimanche. | + | < |
+ | [trainee@redhat9 bin]$ read var1 var2 var3 | ||
+ | fenestros: | ||
- | 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' | + | 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 **/ | + | Restaurez l' |
< | < | ||
- | [root@centos8 ~]# cat / | + | [trainee@redhat9 bin]$ unset IFS |
- | # Run the hourly jobs | + | |
- | SHELL=/ | + | |
- | PATH=/ | + | |
- | MAILTO=root | + | |
- | 01 * * * * root run-parts / | + | |
</ | </ | ||
- | ====1.3 - Les crontabs Utilisateurs==== | + | ====1.3 - La commande test==== |
- | Chaque utilisateur | + | La commande **test** |
+ | |||
+ | **test** // | ||
+ | |||
+ | ou | ||
+ | |||
+ | **[**< | ||
+ | |||
+ | ===Tests de Fichiers=== | ||
+ | |||
+ | ^ Test ^ Description ^ | ||
+ | | -f fichier | Retourne vrai si fichier est d' | ||
+ | | -d fichier | ||
+ | | -r fichier | Retourne vrai si l' | ||
+ | | -w fichier | Retourne vrai si l' | ||
+ | | -x fichier | Retourne vrai si l' | ||
+ | | -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 | ||
< | < | ||
- | [root@centos8 ~]# exit | + | [trainee@redhat9 bin]$ mkdir ../training |
- | logout | + | |
- | [trainee@centos8 ~]$ crontab | + | [trainee@redhat9 bin]$ cd ../ |
- | no crontab for trainee | + | |
+ | [trainee@redhat9 training]$ touch a100 | ||
+ | |||
+ | [trainee@redhat9 training]$ test -f a100 | ||
+ | |||
+ | [trainee@redhat9 training]$ echo $? | ||
+ | 0 | ||
+ | |||
+ | [trainee@redhat9 training]$ [ -f a100 ] | ||
+ | |||
+ | [trainee@redhat9 training]$ echo $? | ||
+ | 0 | ||
</ | </ | ||
- | Afin de créer votre fichier | + | Testez si le fichier |
< | < | ||
- | [trainee@centos8 ~]$ crontab | + | [trainee@redhat9 training]$ [ -f a101 ] |
+ | |||
+ | [trainee@redhat9 training]$ echo $? | ||
+ | 1 | ||
</ | </ | ||
- | Cette commande lance l' | + | Testez si / |
- | <file> | + | <code> |
- | * * * * * /bin/pwd > pwd.txt | + | [trainee@redhat9 training]$ [ -d /home/trainee/training ] |
- | </file> | + | |
- | Sauvegardez et quittez vi. | + | [trainee@redhat9 training]$ echo $? |
+ | 0 | ||
+ | </ | ||
- | 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 | ||
< | < | ||
- | [trainee@centos8 ~]$ crontab -e | + | [trainee@redhat9 training]$ string1=" |
- | no crontab for trainee | + | |
- | crontab: installing new crontab | + | [trainee@redhat9 training]$ string2=" |
+ | |||
+ | [trainee@redhat9 training]$ echo $string1 | ||
+ | root | ||
+ | |||
+ | [trainee@redhat9 training]$ echo $string2 | ||
+ | fenestros | ||
+ | |||
+ | [trainee@redhat9 training]$ [ $string1 = $string2 ] | ||
+ | |||
+ | [trainee@redhat9 training]$ echo $? | ||
+ | 1 | ||
</ | </ | ||
- | <WRAP center round important 60%> | + | Testez si la string1 n'a pas de longueur 0 : |
- | **Important** | + | |
- | </ | + | |
- | Le fichier crontab que vous venez de créer, au nom de votre utilisateur, | + | < |
+ | [trainee@redhat9 training]$ [ -n $string1 ] | ||
- | Malgré le fait que vous venez de l' | + | [trainee@redhat9 training]$ echo $? |
+ | 0 | ||
+ | </ | ||
- | Passez donc en mode super-utilisateur et visualisez le fichier en utilisant | + | Testez si la string1 a une longueur de 0 : |
< | < | ||
- | [trainee@centos8 ~]$ su - | + | [trainee@redhat9 training]$ [ -z $string1 ] |
- | Password: fenestros | + | |
- | [root@centos8 ~]# cat / | + | [trainee@redhat9 training]$ echo $? |
- | * * * * * /bin/pwd > pwd.txt | + | 1 |
</ | </ | ||
- | Afin d' | + | ===Tests sur des nombres=== |
- | * **/ | + | ^ Test ^ Description ^ |
- | * **/ | + | | 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 / | + | Comparez les deux nombres **value1** |
- | =====LAB #2 - anacron===== | + | < |
+ | [trainee@redhat9 training]$ read value1 | ||
+ | 35 | ||
- | L' | + | [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/ | + | [trainee@redhat9 training]$ [ $value1 -lt $value2 ] |
- | ====2.1 - Le Fichier / | + | [trainee@redhat9 training]$ echo $? |
+ | 1 | ||
- | Ouvrez donc le fichier | + | [trainee@redhat9 training]$ [ $value2 -lt $value1 ] |
+ | |||
+ | [trainee@redhat9 training]$ echo $? | ||
+ | 0 | ||
+ | |||
+ | [trainee@redhat9 training]$ [ $value2 -eq $value1 ] | ||
+ | |||
+ | [trainee@redhat9 training]$ echo $? | ||
+ | 1 | ||
+ | </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 | ||
< | < | ||
- | [root@centos8 ~]# cat / | + | [trainee@redhat9 training]$ file=a1OO |
- | # / | + | |
- | # See anacron(8) and anacrontab(5) for details. | + | [trainee@redhat9 training]$ [ ! -d $file ] |
- | SHELL=/bin/sh | + | [trainee@redhat9 training]$ echo $? |
- | PATH=/sbin:/ | + | 0 |
- | 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' |
- | # the jobs will be started during the following hours only | + | |
- | START_HOURS_RANGE=3-22 | + | < |
+ | [trainee@redhat9 training]$ directory=/usr | ||
+ | |||
+ | [trainee@redhat9 training]$ [ -d $directory -a -x $directory ] | ||
- | #period in days delay in minutes | + | [trainee@redhat9 training]$ echo $? |
- | 1 5 cron.daily nice run-parts / | + | 0 |
- | 7 25 cron.weekly nice run-parts / | + | |
- | @monthly 45 cron.monthly nice run-parts / | + | |
</ | </ | ||
- | Vous noterez que ce fichier | + | Testez si l' |
- | ====2.2 | + | < |
+ | [trainee@redhat9 training]$ [ -w a100 -a \( -d /usr -o -d /tmp \) ] | ||
- | Les deux premiers champs sont des champs temporels. Dans le cas d' | + | [trainee@redhat9 training]$ echo $? |
+ | 0 | ||
+ | </ | ||
- | ^ Période ^ Délai ^ | + | ===Tests |
- | | La périodicité en jours | Le délai en minutes, après le **démarrage | + | |
- | Anacron mémorise dans les fichiers qui se trouvent dans **/ | + | ^ Test ^ Description ^ |
+ | | -o option | Retourne vrai si l' | ||
< | < | ||
- | [root@centos8 ~]# ls / | + | [trainee@redhat9 training]$ [ -o allexport |
- | cron.daily | + | |
- | [root@centos8 ~]# cat / | + | [trainee@redhat9 training]$ echo $? |
- | 20210602 | + | 1 |
- | [root@centos8 ~]# cat / | + | |
- | 20210602 | + | |
- | [root@centos8 ~]# cat / | + | |
- | 20210526 | + | |
</ | </ | ||
- | ====2.3 - Le Fichier / | + | ====1.4 - La commande [[ expression ]]==== |
- | Sous RHEL/ | + | La commande |
- | Voici le script | + | ^ Test ^ Description ^ |
+ | | !expression | Retourne vrai si expression est fausse | | ||
+ | | expression1 %%&& | ||
+ | | expression1 %%||%% expression2 | Représente un **ou** logique entre expression1 et expression2 | | ||
+ | | %%(expression)%% | Les parenthèses permettent de regrouper des expressions | ||
+ | |||
+ | D' | ||
+ | |||
+ | ^ 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' | ||
< | < | ||
- | [root@centos8 ~]# cat /etc/ | + | [trainee@redhat9 training]$ [[ -w a100 && ( -d /usr || -d /tmp ) ]] |
- | #!/bin/sh | + | |
- | # Check whether 0anacron was run today already | + | |
- | if test -r /var/ | + | |
- | day=`cat / | + | |
- | fi | + | |
- | if [ `date +%Y%m%d` = " | + | |
- | 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="/ | + | |
- | if [ -f $sysfile ] ; then | + | ====1.5 - Opérateurs du shell==== |
- | if [ `cat $sysfile 2>/ | + | |
- | online=1 | + | ^ Opérateur ^ Description ^ |
- | break | + | | Commande1 %%&& |
- | else | + | | Commande1 %%||%% Commande2 | Commande 2 est exécutée si la première commande renvoie un code faux | |
- | | + | |
- | fi | + | < |
- | 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 | + | |
- | / | + | [trainee@redhat9 training]$ |
</ | </ | ||
- | Ce script a pour but d' | + | ====1.6 |
- | =====LAB #3 - at===== | + | ===La commande expr=== |
- | Tout comme avec la commande | + | La commande |
- | * **/etc/at.allow** | + | expr < |
- | * **/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 < |
+ | |||
+ | ou | ||
+ | |||
+ | expr < | ||
+ | |||
+ | ou | ||
+ | |||
+ | expr < | ||
+ | |||
+ | ==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 : | ||
< | < | ||
- | [root@centos8 ~]# at 13:00 12/ | + | [trainee@redhat9 training]$ x=2 |
- | warning: commands will be executed using /bin/sh | + | |
- | at> pwd > / | + | |
- | at> < | + | |
- | 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 > / | + | |
- | at> < | + | |
- | job 2 at Wed Dec 31 14:00:00 2042 | + | |
</ | </ | ||
- | ====3.1 - Le Répertoire / | + | 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 **/ | + | < |
+ | [trainee@redhat9 training]$ expr $x+2 | ||
+ | 2+2 | ||
+ | </code> | ||
+ | |||
+ | Les opérateurs doivent être protégés | ||
< | < | ||
- | [root@centos8 ~]# ls / | + | [trainee@redhat9 training]$ expr $x * 2 |
- | a000010249d9f8 | + | expr: syntax error |
+ | |||
+ | [trainee@redhat9 training]$ expr $x \* 2 | ||
+ | 4 | ||
</ | </ | ||
- | A l'examen du deuxième fichier, vous constaterez | + | Mettez le résultat d' |
< | < | ||
- | [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: |