Test simple

Résolu
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. merci!
    existe il la construction inverse à

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

    pour que le test soit valide quand il n'y a PAS que des chiffres?
    merci
    1. Contributeur
      T'enlève le "^" et le "$".
  2. salut,

    sans regex :
    [[ $v == +([0-9]) ]] && echo "is a number" || echo "is NOT a number"
    1. merci,
      mais là je ne suis pas assez familier à cette syntaxe pour l'intégrer dans ma boucle
  3. Merci...
    malheureusement, malgré l'ajout des doubles ]
    j'ai toujours
    17 is not number
    1. Contributeur
      On peut voir ton script complet ?
    2. Contributeur
      Oups, j'avais pas fait attention au signe "==" ;-\

      Il faut le remplacer par "=~"
    3. 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
    4. 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!!
  4. Contributeur
    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 ...