Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 tongue ( 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 big_smile
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 roll 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 big_smile ; 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 wink

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

RaphaelG a écrit :

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. big_smile


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

RaphaelG a écrit :

Question subsidiaire ; $UID ou "$UID" ?

ni l'un, ni l'autre. Dans une évaluation arithmétique : UID, tout nu. big_smile

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