#76 Hier à 17:38
- iznobe
Re : script pour montage automatique partitions de données
merci pour l' explication .
de toute maniere , je suis plus à l' aise avec la syntaxe : $(cmd) .
j ' ai complémenter les tests de regex et finalement , ca ne marche pas , mais limite , je me demande si ce n ' est pas un bug ( m ' etonnerait quand meme ) .
Pour faire des tests en boucle , voici un script infini :
#!/bin/bash
rgx="([abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-]+)"
while [ -z "$Label" ]; do
echo -n "Choisissez l ' étiquette ( LABEL ) de votre partition de données ( pas d' espace , d' accent ni de caractères spéciaux , 16 caractères maximum ) "
read Label
if [[ "$Label" =~ $rgx ]]; then
echo "le nom de votre étiquette est conforme "
unset Label
else
echo "le nom de votre étiquette comporte un espace, un accent ou un caractère spécial ou plus de 16 caractères !"
unset Label
fi
done
simplissime non ?
par contre , si je donne " m m " a la valeur de la variable , il considere que c' est " conforme " , il est k0n ou c' est moi ?
il a vu ou les espaces dans la regex ???
j ' ai essayé sans les ( ) , mais resultat identique , vu que ca ne sert qu ' a capturer et qu ' elles sont inutiles dans ce bout de code , vu qu ' il n' y a plus de capture .
Dernière modification par iznobe (Hier à 17:43)
retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#77 Hier à 17:53
- geole
Re : script pour montage automatique partitions de données
Bonjour
Manifestement, il n'y a pas que les espaces..
a@b:~$ while [[ 1 < 2 ]]; do echo -n "Choisissez l ' étiquette ( LABEL ) de votre partition de données ( pas d' espace , d' accent ni de caractères spéciaux , 16 caractères maximum ) "; read Label; if [[ "$Label" =~ $rgx ]]; then echo "le nom de votre étiquette "$Label" est conforme "; else echo "le nom de votre étiquette "$Label" comporte un espace, un accent ou un caractère spécial ou plus de 16 caractères !"; fi; done
Choisissez l ' étiquette ( LABEL ) de votre partition de données ( pas d' espace , d' accent ni de caractères spéciaux , 16 caractères maximum ) aaaaQQQQ-D
le nom de votre étiquette aaaaQQQQ-D est conforme
Choisissez l ' étiquette ( LABEL ) de votre partition de données ( pas d' espace , d' accent ni de caractères spéciaux , 16 caractères maximum ) A"]~
le nom de votre étiquette A"]~ est conforme
Choisissez l ' étiquette ( LABEL ) de votre partition de données ( pas d' espace , d' accent ni de caractères spéciaux , 16 caractères maximum )
le nom de votre étiquette A"]~ est conforme
Choisissez l ' étiquette ( LABEL ) de votre partition de données ( pas d' espace , d' accent ni de caractères spéciaux , 16 caractères maximum ) aéb
le nom de votre étiquette aéb est conforme
Choisissez l ' étiquette ( LABEL ) de votre partition de données ( pas d' espace , d' accent ni de caractères spéciaux , 16 caractères maximum ) é
le nom de votre étiquette é comporte un espace, un accent ou un caractère spécial ou plus de 16 caractères !
Choisissez l ' étiquette ( LABEL ) de votre partition de données ( pas d' espace , d' accent ni de caractères spéciaux , 16 caractères maximum )
Dernière modification par geole (Hier à 17:55)
Les grilles de l'installateur https://doc.ubuntu-fr.org/tutoriel/inst … _subiquity
"gedit admin:///etc/fstab" est proscrit, utilisez "pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY xdg-open /etc/fstab" Voir https://doc.ubuntu-fr.org/gedit
Les partitions EXT4 des disques externes => https://forum.ubuntu-fr.org/viewtopic.p … #p22697248
Hors ligne
#78 Hier à 18:08
- iznobe
Re : script pour montage automatique partitions de données
#!/bin/bash
rgx="[^abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-]"
while [ -z "$Label" ]; do
echo -n "Choisissez l ' étiquette ( LABEL ) de votre partition de données ( pas d' espace , d' accent ni de caractères spéciaux , 16 caractères maximum ) "
read Label
if [[ "$Label" =~ $rgx ]]; then
echo "le nom de votre étiquette comporte un espace, un accent ou un caractère spécial ou plus de 16 caractères !"
unset Label
else
echo "le nom de votre étiquette est conforme "
unset Label
fi
done
comme ça , c' est mieux , mais il accepte les espaces en début et fin de chaine ...
Dernière modification par iznobe (Hier à 18:15)
retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#79 Hier à 18:13
- RaphaelG
Re : script pour montage automatique partitions de données
Ce qui est strictement équivalent :
`cmd` et $(cmd)
"`cmd`" et "$(cmd)"
En tout cas avec les 2 shells que j'ai à ma disposition à savoir :
~$ dpkg -l bash dash | sed 1,5d
ii bash 5.2.21-2ubuntu4 amd64 GNU Bourne Again SHell
ii dash 0.5.12-6ubuntu5 amd64 POSIX-compliant shell
~$
ShellCheck nous le dit : les backticks (moi je dis plutôt back quotes) sont legacy. Je ne vois pas pourquoi on se passerait d'un héritage.
Moi, j'aime bien les back quotes. Par rapport à la forme $(cmd), on gagne un caractère. Il n'y a pas de petit profit.
Et puis j'ai mes raisons sentimentalo-nostalgiques. Lorsque j'ai débuté les shell scripts au début des années 90, c'était depuis le Bourne shell et celui ci ne connaissait que la forme `cmd`.
C'est pas ShellCheck qui va m'empêcher de les utiliser. OK boomer !
Par contre quand on commence à imbriquer des commandes comme le décrit Watael, effectivement j'admets que la forme $(cmd) est plus facile à appréhender. Mais ce n'est pas le cas dans ce post.
Quant à encadrer $(id -u) par des double quotes, je ne vois pas en quelle circonstance id pourrait renvoyer une chaîne nulle ou 2 chaînes de caractères séparées par un metacarcatère.
Pour ta regex :
Modifier des variables d'environnement depuis un shell script ne te fait pas courir de risque. Dès que tu quittes le script, tu reviens à ton environnement initial.
Je ne comprends pas ton motif #.[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_\-]#+
D'abord si tu n'utilises plus BASH_REMATCH, tu n'a plus besoin de l'encadrer par des parenthèses.
Mais de toute manière, ton nouveau traitement de ta regex ne fonctionne pas. Ca boucle de manière infinie.
Si tu ne veux vraiment pas toucher aux variables d'environnement, je te propose cela :
#!/usr/bin/bash
rgx="[^abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-]"
while [ -z "$Label" ]
do
echo -n "Choisissez l'étiquette (LABEL) de votre partition de données (pas d'espace, d'accent ni de caractère spécial, 16 caractères maximum) "
read Label
if [[ "$Label" =~ $rgx || "${#Label}" -gt 16 ]]
then
echo "le nom de votre étiquette comporte un espace, un accent ou un caractère spécial ou plus de 16 caractères !"
unset Label
else echo "Label : $Label"
fi
done
Le motif est bien évidemment plus long mais il y a moins de ligne.
Dernière modification par RaphaelG (Hier à 18:15)
Hors ligne
#80 Hier à 18:20
- iznobe
Re : script pour montage automatique partitions de données
Si tu ne veux vraiment pas toucher aux variables d'environnement, je te propose cela :
Posts croisés
j ' ai écris exactement la même chose , sauf que justement , il reste un problème ... il prend les espaces avant et après sans utiliser rematch voilà pourquoi je testais dans une boucle infinie ce que je pensais être l' inverse , sauf que non .
il n ' empeche que je ne comprends toujours pas pourquoi notre regex laisse passer ces espaces en début et fin de chaine ...
exemple :
Choisissez l ' étiquette ( LABEL ) de votre partition de données ( pas d' espace , d' accent ni de caractères spéciaux , 16 caractères maximum ) pppp
le nom de votre étiquette est conforme
je ne compte rien t ' empêché de faire du tout tu es libre ; c' était juste une remarque que je me faisais , que , justement shell check , dans certains cas , c' est un peu bidon . mais faut avouer que dans la plupart des cas , ca aide bien .
Dernière modification par iznobe (Hier à 18:24)
retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#81 Hier à 18:29
- RaphaelG
Re : script pour montage automatique partitions de données
Chez moi ça marche. read ne met pas les espaces dans la variable Label.
Hors ligne
#82 Hier à 18:32
- iznobe
Re : script pour montage automatique partitions de données
heu .
je m' attends , vu la regex , que si un espace est entré dans le champ texte , alors ce soit " non conforme " .
tu me dis que si tu tapes : " espace espace b k n espace espace "
il te repond que c ' est conforme et supprime les espaces au début et a la fin et que donc le label est en fait "bkn" ?
retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#83 Hier à 18:39
- iznobe
Re : script pour montage automatique partitions de données
je viens de tester , et effectivement c' est bien le cas , il supprime les espaces en debut et fin de chaine ...
ca fait 2 heures que je bataille sur cette ....
Choisissez l ' étiquette ( LABEL ) de votre partition de données ( pas d' espace , d' accent ni de caractères spéciaux , 16 caractères maximum ) ppppp
le nom de votre étiquette est conforme:ppppp|
même en entrant plus de 50 espaces dans le nom de l' étiquette .
Dernière modification par iznobe (Hier à 18:40)
retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#84 Hier à 18:39
- RaphaelG
Re : script pour montage automatique partitions de données
Oui !
Si tu veux t'en convaincre, rajoute dans ton script :
echo $Label | od -Ad -tcx1
Hors ligne
#85 Hier à 18:47
- iznobe
Re : script pour montage automatique partitions de données
ok , une subtulité de read donc ... merci , j ' aurais appris ca encore
juste une dernière question , est ce que :
rgx="[^abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-]"
while [ -z "$Label" ]
do
echo -n "Choisissez l'étiquette (LABEL) de votre partition de données (pas d'espace, d'accent ni de caractère spécial, 16 caractères maximum) "
read Label
if [[ "$Label" =~ $rgx || "${#Label}" -gt 16 ]]
then
...
et
rgx="[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-]"
while [ -z "$Label" ]
do
echo -n "Choisissez l'étiquette (LABEL) de votre partition de données (pas d'espace, d'accent ni de caractère spécial, 16 caractères maximum) "
read Label
if [[ ! "$Label" =~ $rgx || "${#Label}" -gt 16 ]]
then
..
c' est pareil ? ( modif regex et condition a l' envers )
retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#86 Hier à 18:51
- Watael
Re : script pour montage automatique partitions de données
Quant à encadrer $(id -u) par des double quotes, je ne vois pas en quelle circonstance id pourrait renvoyer une chaîne nulle ou 2 chaînes de caractères séparées par un metacarcatère.
t'énerve pas comme ça
d'tout'façon e' sert à rien cette commande, puisqu'on a $UID.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#87 Hier à 19:12
- RaphaelG
Re : script pour montage automatique partitions de données
@iznobe:
Le motif [abc] touche toutes les chaînes de caractère qui contiennent un 'a' ou un 'b' ou un 'c'.
Le motif [^abc] touche toutes les chaînes qui ne contiennent pas un 'a', ni un 'b', ni un 'c'.
@watael :
Ah bien sûr que si que je m'énerve !
C'est le grand principe de la robotique et de l'informatique : l'homme doit rester plus fort que la machine et plus fort que l'IA.
Mais faut que je me calme car tu as raison. Autant tester $UID.
Question subsidiaire ; $UID ou "$UID" ?
Dernière modification par RaphaelG (Hier à 19:30)
Hors ligne
#88 Hier à 19:12
- iznobe
Re : script pour montage automatique partitions de données
avec choix numero 2 ( regex non inversée ) :
Choisissez l ' étiquette ( LABEL ) de votre partition de données ( pas d' espace , d' accent ni de caractères spéciaux , 16 caractères maximum ) m&m's
le nom de votre étiquette est conforme
Donc non , malgré ce qu ' il parait au 1er abord , ca n' est pas l' inverse ... il faut modifier la regex aussi .
Dernière modification par iznobe (Hier à 19:14)
retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#89 Hier à 19:20
- RaphaelG
Re : script pour montage automatique partitions de données
Ben oui, en #79 le motif de ma regex commence par [^
edit : je complète parce que j'ai l'impression que c'est pas très clair dans ta tête.
Le motif [abc]+ touche les chaînes 'a', 'ab', 'aba', 'aabbcc' .... Il y a une infinité de chaînes qui correspondent au motif.
Par contre les chaines 'd', 'abd', 'bde' .... ne correspondent pas au motif. La chaîne nulle '' ne correspond pas non plus à cause du répéteur '+'.
Le motif [^abc] touche toutes les chaînes qui ne contienne ni 'a', ni 'b', ni 'c'. Par exemple les chaînes 'd', 'de', 'ded', 'ddeeff' ....
Les chaînes 'a', ae', 'be', 'ec', 'efgb' ne correspondent pas.
IHTH
Dernière modification par RaphaelG (Hier à 19:54)
Hors ligne
#90 Hier à 20:32
- Watael
Re : script pour montage automatique partitions de données
Question subsidiaire ; $UID ou "$UID" ?
ni l'un, ni l'autre. Dans une évaluation arithmétique : UID, tout nu.
if ((UID)); ...
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#91 Aujourd'hui à 01:17
- iznobe
Re : script pour montage automatique partitions de données
ce que je ne trouve pas clair , c' est plutôt :
rgx=[^abc]
rgx2=[abc]
var=$("$chaine" =~ $rgx)
var2=$( ! "$chaine" =~ $rgx2)
var === var2
logiquement pour moi var et var 2 devrait être égales dans tous les cas puisque le ^ en tête signifie inverse de la regex , comme le ! .
Dernière modification par iznobe (Aujourd'hui à 01:19)
retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne