Vous n'êtes pas identifié(e).
L'icône rouge permet de télécharger chaque page du wiki visitée au format PDF et la grise au format ODT →
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
atelier:chantier:bash-comparaison-lexicographique-des-chaines [13/02/2023 00:35] agp91 [Tests avec [[] |
atelier:chantier:bash-comparaison-lexicographique-des-chaines [15/02/2023 20:52] agp91 [Introduction] |
||
---|---|---|---|
Ligne 2: | Ligne 2: | ||
* Objet : Usage des opérateurs lexicographiques < et > dans les commandes de test | * Objet : Usage des opérateurs lexicographiques < et > dans les commandes de test | ||
- | * Niveau requis : {{tag>débutant avisé}} | + | * Niveau requis : {{tag>débutant}} |
* Commentaires : Ligne de commande et script bash | * Commentaires : Ligne de commande et script bash | ||
* Débutant, à savoir : [[:doc:systeme:commandes:le_debianiste_qui_papillonne|Utiliser GNU/Linux en ligne de commande, tout commence là !.]] :-) | * Débutant, à savoir : [[:doc:systeme:commandes:le_debianiste_qui_papillonne|Utiliser GNU/Linux en ligne de commande, tout commence là !.]] :-) | ||
Ligne 8: | Ligne 8: | ||
* Création par [[user>agp91]] 12/02/2023 | * Création par [[user>agp91]] 12/02/2023 | ||
* Testé par <...> le <...> FIXME | * Testé par <...> le <...> FIXME | ||
- | * Commentaires sur le forum : [[https://debian-facile.org/viewtopic.php?pid=392903#p392903| Lien vers le forum concernant ce tuto]] ((N'hésitez pas à y faire part de vos remarques, succès, améliorations ou échecs !)) FIXME | + | * Commentaires sur le forum : [[https://debian-facile.org/viewtopic.php?pid=392903#p392903| Lien vers le forum concernant ce tuto]] ((N'hésitez pas à y faire part de vos remarques, succès, améliorations ou échecs !)) |
**Nota :** | **Nota :** | ||
Ligne 18: | Ligne 18: | ||
===== Introduction ===== | ===== Introduction ===== | ||
- | La comparaison lexicographique entre deux chaîne permet de savoir si une chaîne est placée dans l'ordre lexicographique (comme dans un dictionnaire) avant ou après une autre chaîne. | + | La comparaison lexicographique entre deux chaînes permet de savoir si une chaîne est placée dans l'ordre lexicographique (comme dans un dictionnaire) avant ou après une autre chaîne. |
- | Nous avons tous lu et relu (peut-être même archi lu;) le manpage de bash (RTFM).\\ | + | Nous avons tous lu et relu (peut-être même archi lu;) la page de manuel de bash (RTFM).\\ |
Nous pouvons y lire (man bash) : | Nous pouvons y lire (man bash) : | ||
Ligne 46: | Ligne 46: | ||
* Une commande de test renvoie le code de retour true (0) lorsque le test réussi et false (1) lorsqu'il échoue. | * Une commande de test renvoie le code de retour true (0) lorsque le test réussi et false (1) lorsqu'il échoue. | ||
* Le code retour d'une commande est mémorisé dans le paramètre spécial **$?**. | * Le code retour d'une commande est mémorisé dans le paramètre spécial **$?**. | ||
- | * La commande **<nowiki>&&</nowiki>** exécute la commande suivante, si la commande précédente à renvoyée le code retour true (égale à 0). | + | * L'opérateur **<nowiki>&&</nowiki>** exécute la commande suivante, si la commande précédente à renvoyée le code retour true (égale à 0). |
- | * La commande **<nowiki>||</nowiki>** exécute la commande suivante, si la commande précédente à renvoyée le code retour false (différent de 0). | + | * L'opérateur **<nowiki>||</nowiki>** exécute la commande suivante, si la commande précédente à renvoyée le code retour false (différent de 0). |
Plus bas, nous utilisons //le méta caractère *****// dans le développement des chemins. L'option //**noglob**// ne doit donc pas être active.\\ | Plus bas, nous utilisons //le méta caractère *****// dans le développement des chemins. L'option //**noglob**// ne doit donc pas être active.\\ | ||
Ligne 129: | Ligne 129: | ||
Voici ce qu'il se passe :\\ | Voici ce qu'il se passe :\\ | ||
- | Dans une commande [ (ou test), les opérateurs < ou >, utilisés tels quels, ne sont pas des opérateurs de comparaison (lexicographique ou numérique).\\ | + | Dans une commande **[** (ou **test**), les opérateurs **<** ou **>**, utilisés tels quels, ne sont pas des opérateurs de comparaison lexicographique (ou numérique).\\ |
--> Ils restent des opérateurs de redirection ! | --> Ils restent des opérateurs de redirection ! | ||
- | En utilisant la commande test, nous pouvons peut-être mieux le visualiser : | + | En utilisant la commande **test**, nous pouvons peut-être mieux le visualiser : |
<code>test 42 > 4242</code> | <code>test 42 > 4242</code> | ||
Ligne 138: | Ligne 138: | ||
Pour preuve, l'exploration de notre répertoire de test suffira : | Pour preuve, l'exploration de notre répertoire de test suffira : | ||
- | <code user>echo * # Si l'option noglob n'est pas active, echo * est l'équivalent interne de la commande externe ls.</code> | + | <code user> |
- | <file config retour de la commande>4242 a z</file> | + | echo * # Si l'option noglob n'est pas active, echo * est l'équivalent interne de la commande externe ls.</code> |
+ | <file config retour de la commande> | ||
+ | 4242 a z | ||
+ | </file> | ||
Les fichiers 4242, a et z ont été créés par nos tests [ 42 > 4242 ], [ z > a ] et [ a > z ].\\ | Les fichiers 4242, a et z ont été créés par nos tests [ 42 > 4242 ], [ z > a ] et [ a > z ].\\ | ||
Ligne 145: | Ligne 148: | ||
Pour démonstration, retirons le droit d'écriture au répertoire test. | Pour démonstration, retirons le droit d'écriture au répertoire test. | ||
- | <code user>rm -v * | + | <code user> |
- | chmod -v a-w ../test</code> | + | rm -v * # Suppression de tout les fichiers présent dans le répertoire courant. |
- | <file config retour de la commande>4242' supprimé | + | chmod -v a-w ../test # Suppression du droit d'écriture pour tous du répertoire ../test. |
+ | </code> | ||
+ | <file config retour de la commande> | ||
+ | 4242' supprimé | ||
'a' supprimé | 'a' supprimé | ||
'z' supprimé | 'z' supprimé | ||
Ligne 155: | Ligne 161: | ||
Et re-testons : | Et re-testons : | ||
- | <code user>[ aa > az ] ; echo $?</code> | + | <code user> |
+ | [ aa > az ] ; echo $? | ||
+ | </code> | ||
<file config retour de la commande> | <file config retour de la commande> | ||
bash: az: Permission non accordée | bash: az: Permission non accordée | ||
- | 1</file> | + | 1 |
+ | </file> | ||
- | Le code de retour renvoie 1 (faux) car les fichiers az et 42 ne peuvent être créés et génèrent une erreur dans le test.\\ | + | Le code de retour renvoie 1 (faux) car le fichier az ne peut être créé et génère une erreur dans le test.\\ |
- | Mais alors, le manpage de bash raconte des sottises ?\\ | + | Mais alors, la page du manuel de bash raconte des sottises ?\\ |
Non !\\ | Non !\\ | ||
- | Il y est simplement omis, que les opérateurs < et > doivent être protégés, pour être interprétés comme des opérateurs de comparaison lexicographique.\\ | + | Il y est simplement omis, que **les opérateurs < et > doivent être protégés**, pour être interprétés comme des opérateurs de comparaison lexicographique.\\ |
- | Les trois types de protection (\, entre guillemets simples et entre guillemets doubles) fonctionnent. | + | Les trois types de protection fonctionnent (**\**, entre guillemets simples **''** et entre guillemets doubles **""**). |
<code user>[ aa \> az ] && echo "vrai" || echo "faux" | <code user>[ aa \> az ] && echo "vrai" || echo "faux" |