Test simple

Résolu
moreje -  
zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

j'essaye un script bash ou je recupere et veux tester un argument optenu par getopts

MYVAR=$OPTARG 
echo ${MYVAR} 
if [[ "$MYVAR" == [:digit:] ]] then 
echo $MYVAR  is number 
exit 1 
else echo $MYVAR  is not number 
fi


mon probleme, c'est que si je mets '17' comme argument dans ma commande mon code me sort:

17 is not number 


une idée sur ce que je fais mal?
a terme, je voudrais pouvoir entrer une array de nombres en argument : '17 5 12 25'
Merci!

4 réponses

  1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    Salut,

    Pour une classe définie, il faut des doubles crochets "[[:digit:]]".
    Ensuite si le then est sur la même ligne que le "if" il faut le séparer par un point virgule :
     if [[ "$MYVAR" == [[:digit:]] ]] ; then ...

    1
  2. moreje2lyon Messages postés 26 Statut Membre
     
    Merci...
    malheureusement, malgré l'ajout des doubles ]
    j'ai toujours
    17 is not number
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      On peut voir ton script complet ?
      0
    2. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Oups, j'avais pas fait attention au signe "==" ;-\

      Il faut le remplacer par "=~"
      0
    3. moreje2lyon Messages postés 26 Statut Membre
       
      voilà:

      #!/bin/bash 
      
      while getopts ":l:" opt; do 
        case $opt in 
          l) 
            echo "-l actif: les labels selectionnés sont: $OPTARG" >&2 
            MYVAR=$OPTARG 
            echo ${MYVAR} 
              if [[ "$MYVAR" == [[:digit:]] ]] ; then  
              echo "-l: $MYVAR is number" 
              exit 1 
              else echo "${MYVAR} is not number" 
              fi 
            ;; 
          \?) 
            echo "option invalide: -$OPTARG" >&2 
            exit 1 
            ;; 
          :) 
            echo "Option $OPTARG necessite un argument" >&2 
            exit 1 
            ;; 
        esac 
      done


      et la commande:
      moncode -l '17' fichieratraiter
      0
    4. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Voir message #4
      0
    5. moreje2lyon Messages postés 26 Statut Membre
       
      super, merci c'est presque bon!
      c'est quoi la signification de ce ~ ?

      Je dis presque bon, car si le nom de mon fichier a traiter contient un chiffre, et que je lance une commande avec une erreur (oubli de l'argument)
      moncode -l fichieratraiter1
      le test passe car il trouve un chiffre dans le nom de fichier.
      sais tu comment tester pour que l'argument ne contienne QUE des chiffres?
      Merci!!
      0
  3. Utilisateur anonyme
     
    salut,

    sans regex :
    [[ $v == +([0-9]) ]] && echo "is a number" || echo "is NOT a number"
    0
    1. moreje2lyon Messages postés 26 Statut Membre
       
      merci,
      mais là je ne suis pas assez familier à cette syntaxe pour l'intégrer dans ma boucle
      0
  4. moreje2lyon Messages postés 26 Statut Membre
     
    merci!
    existe il la construction inverse à

    =~ ^[[:digit:]]*$

    pour que le test soit valide quand il n'y a PAS que des chiffres?
    merci
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      T'enlève le "^" et le "$".
      0