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

    1
    1. Merci...
      malheureusement, malgré l'ajout des doubles ]
      j'ai toujours
      17 is not number
      0
      1. Contributeur
        On peut voir ton script complet ?
        0
      2. Contributeur
        Oups, j'avais pas fait attention au signe "==" ;-\

        Il faut le remplacer par "=~"
        0
      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
        0
      4. Contributeur
        Voir message #4
        0
      5. 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
    2. salut,

      sans regex :
      [[ $v == +([0-9]) ]] && echo "is a number" || echo "is NOT a number"
      0
      1. merci,
        mais là je ne suis pas assez familier à cette syntaxe pour l'intégrer dans ma boucle
        0
    3. 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. Contributeur
        T'enlève le "^" et le "$".
        0