IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Tester le contenu d'une variable


Sujet :

Shell et commandes GNU

  1. #1
    Membre confirmé
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juillet 2020
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2020
    Messages : 175
    Par défaut Tester le contenu d'une variable
    Bonjour,
    Je cherche à tester le contenu d'une variable selon différents formats.

    1) Premier cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var=400.562523285041004195
    if [[ $var = [0-9\.]{0,22} ]] ; then
        echo "OK"
    else
        echo "KO"
    fi
    Cela me retourne KO au lieu de OK ? et je ne comprends pas pourquoi !

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 640
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 640
    Par défaut
    =~ sinon, tu ne testes pas une regex !

    edit: ta regex n'est pas assez précise.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre confirmé
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juillet 2020
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2020
    Messages : 175
    Par défaut
    Merci N_bah.

    Voila ce que j'ai fait et ca à l'air de marcher :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    rgx='^[0-9\.]{0,22}$'
    if [[ $maVAR =~ $rgx ]] ; then
        echo "OK"
    else
        echo "KO"
    fi
    En temps normal, ce que je récupère dans ma variable maVAR ressemble à cela :
    400.625232850410041957
    Le pas beau qui peut être récupérer si problème :
    at /Users/akinsella/Workspace/Projects/gtfs-playground/build/app-test.js:16:11
    at callbacks (/Users/akinsella/Workspace/Projects/gtfs-playground/node_modules/express/lib/router/index.js:164:37)
    at param (/Users/akinsella/Workspace/Projects/gtfs-playground/node_modules/express/lib/router/index.js:138:11)
    at pass (/Users/akinsella/Workspace/Projects/gtfs-playground/node_modules/express/lib/router/index.js:145:5)
    at Router._dispatch (/Users/akinsella/Workspace/Projects/gtfs-playground/node_modules/express/lib/router/index.js:173:5)
    at Object.router (/Users/akinsella/Workspace/Projects/gtfs-playground/node_modules/express/lib/router/index.js:33:10)
    at next (/Users/akinsella/Workspace/Projects/gtfs-playground/node_modules/express/node_modules/connect/lib/proto.js:193:15)
    at Object.expressInit [as handle] (/Users/akinsella/Workspace/Projects/gtfs-playground/node_modules/express/lib/middleware.js:30:5)
    at next (/Users/akinsella/Workspace/Projects/gtfs-playground/node_modules/express/node_modules/connect/lib/proto.js:193:15)
    at Object.query [as handle] (/Users/akinsella/Workspace/Projects/gtfs-playground/node_modules/express/node_modules/connect/lib/middleware/query.js:45:5)
    MAIS...
    Donc ce que je récupère dans ma variable maVAR provient d'un retour qui peut être du n'importe quoi sur plusieurs ligne du style vraiment pas beau.
    Mon petit script ci-dessus semble traiter sur une ligne. Mais si le retour dans ma variable est sur plusieurs lignes, mon script ne traitera pas les autres lignes ?

    Dans ce cas, ne vaudrait-il mieux pas que je récupère plutôt dans un fichier.txt, que je teste le contenu avec un sed, puis que je mette dans ma variable ma VAR ?
    Comme ca, je suis vraiment sûr que dans ma variable maVAR, c'est vraiment propre.
    D'avance merci pour votre aide ;-)

  4. #4
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 640
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 640
    Par défaut
    s'il y a du "pas beau" , c'est peut-être que le requête initiale n'est pas assez précise...

    il y a une discussion ouverte sur notre forum à ce sujet ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Membre confirmé
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juillet 2020
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2020
    Messages : 175
    Par défaut
    En fait la requête node js fonctionnait bien mais je suis passé sur un VPS moins performant et cela a donné des problèmes de marshmaling.
    Du coup, je teste sur la récup.

    Est-ce que mon petit script me garanti de tester tout le contenu de la variable ?
    En d'autre terme, est-ce que le test regex garanti qu'il n'y a QUE le nombre 400.625232850410041957 et rien d'autre dans la variable ?

  6. #6
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 640
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 640
    Par défaut
    la regex dit :
    - commence par un nombre ou un point
    - est d'une longueur totale comprise entre 0 et 22 nombre(s) ou point(s)
    il pourrait donc y avoir plusieurs points. :/

    avec celle-là, ^[0-9]*\.*[0-9]+$, la variable doit se finir par des nombres uniquement, et commencer par des nombres (ou pas), ou un point (ou pas).
    par contre, on ne contrôle pas la longueur de la variable. C'est important ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    Membre confirmé
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juillet 2020
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2020
    Messages : 175
    Par défaut
    Merci N_baH pour ta réponse.

    TOUTE ma variable ne doit contenir QUE ce genre de chose : 400.625232850410041957 Si plusieurs points finalement c'est pas grave et de longueur 22 caractères max.
    J'imagine que tester la longueur est important car si le test regex s'applique sur la première ligne de la variable sans tenir compte des autres lignes suivantes, alors je pourrais avoir un nombre de 22 caractères sur la première ligne et pleins d'autres lignes avec plein de vilaines choses.
    et croyant ma variable bonne, donc recopier le contenu de cette variable dans une ligne d'un fichier, par cron, et bien je ne recopie pas que mon nombre de 22 caractères, mais aussi toute le reste contenu dans la variable. Et comme cela, j'ai réussi à saturer le disque de mon VPS.

    Mais j'ai l'impression que selon ce que tu me dis, une variable considère son contenu, c'est à dire à un format, d'UNE SEULE ligne. Donc dans ce cas, si TOUT le contenu de la variable commence par des chiffres, continu avec des chiffres et finit par des chiffres et est de longueur 22 caractères, alors c'est parfait.

  8. #8
    Membre confirmé
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juillet 2020
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2020
    Messages : 175
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    la regex dit :
    - commence par un nombre ou un point
    - est d'une longueur totale comprise entre 0 et 22 nombre(s) ou point(s)
    il pourrait donc y avoir plusieurs points. :/

    avec celle-là, ^[0-9]*\.*[0-9]+$, la variable doit se finir par des nombres uniquement, et commencer par des nombres (ou pas), ou un point (ou pas).
    par contre, on ne contrôle pas la longueur de la variable. C'est important ?
    En fait quand tu dis ca, j'arrive pas à comprendre si tu considères le contenu TOTAL de la variable.
    Est-ce que tu es sur dans ce cas qu'il n'y a absolument rien d'autre dans la variable de pas beau ?

    Car dans un fichier par exemple, et avec sed, on précise si on traite ligne par ligne pour etre sur de tout considérer !

    A moins que le format du contenu d'une variable ne peut être qu'UNE seule ligne et alors dans ce cas il n'y a plus de problème...

  9. #9
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 640
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 640
    Par défaut
    la regex est testée sur la variable totale.
    la regex ne correspondra pas si il y a plusieurs lignes, parce que la regex indique qu'il ne doit y avoir que des nombres et un/des point(s); donc, pas de \n.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  10. #10
    Membre confirmé
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juillet 2020
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2020
    Messages : 175
    Par défaut
    Aaaah Ok, tu m'enlèves mon problème psychologique.
    Donc je comprends que le format d'une variable est considéré comme une seule ligne, un seul bloc, donc on traite une seule ligne, qui peut comprendre des \n et donner l'illusion de plusieurs ligne, alors que son format traitable est fondamentalement comme une seule ligne, un seul bloc, un tout en fait.
    Excuses la lourdeur mais je voudrais etre sur de bien avoir compis

  11. #11
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 640
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 640
    Par défaut
    toute la variable est traitée, qu'elle contienne une ou plusieurs lignes.
    la regex, telle qu'édictée, prévoit qu'il n'y a pas de retour à la ligne (\n).
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  12. #12
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    J'espère ne pas dire de grosse bêtise, mais il me semble avoir compris que le test "=~" teste si toute la chaine correspond à la regexp, alors que grep va tester ligne par ligne et est ok si une partie seulement de la ligne correspond à la regexp.

    Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if grep -q "o" <<< "coucou"; then echo 'ok'; else echo 'ko'; fi
    => ok
    Si on veut tester une ligne entière avec grep, il faut soit utiliser l'option -x (ou --line-regexp), soit bêtement encapsuler l'expression de début et fin de ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if grep -q -x "o" <<< "coucou"; then echo 'ok'; else echo 'ko'; fi
    => ko
    if grep -q -x "o" <<< "o"; then echo 'ok'; else echo 'ko'; fi
    => ok
     
    if grep -q "^o$" <<< "coucou"; then echo 'ok'; else echo 'ko'; fi
    => ko
    if grep -q -x "^o$" <<< "o"; then echo 'ok'; else echo 'ko'; fi
    => ok
    En revanche, si on veut vérifier que l'entrée ne contient qu'une seule ligne, c'est plus compliqué avec grep...

  13. #13
    Membre confirmé
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juillet 2020
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2020
    Messages : 175
    Par défaut
    merci jack-ft ;-)

  14. #14
    Membre confirmé
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juillet 2020
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2020
    Messages : 175
    Par défaut
    Du coup, je pense retenir la solution suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var=348.719167482121043625
    rgx='^[0-9]{1,3}\.[0-9]{1,18}$'
    if [[ $var =~ $rgx ]] ; then
        echo "OK"
    else
        echo "KO"
    - Toujours un nombre flottant
    - Partie entière entre 1 et 3 caractères avant le point
    - Partie décimale entre 1 et 18 caractères après le point
    - Que des chiffres, aucun autre caractère d'aucune sorte dans toute la variable

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Tester si le contenu d'une variable est en majuscule
    Par diombo dans le forum VBA Access
    Réponses: 8
    Dernier message: 16/01/2019, 15h45
  2. [Batch] Tester contenu d'une variable
    Par madmaxou dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 28/10/2009, 07h53
  3. tester le contenu d'une variable
    Par zougagh dans le forum C
    Réponses: 4
    Dernier message: 05/02/2009, 11h46
  4. [XSLT] Tester le contenu d'une variable
    Par DotNET74 dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 10/12/2006, 12h42
  5. tester la définiton d'une variable
    Par mathieu dans le forum XSL/XSLT/XPATH
    Réponses: 9
    Dernier message: 06/09/2003, 11h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo