Test simple

Résolu/Fermé
moreje - Modifié par moreje le 28/01/2013 à 10:53
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 - 28 janv. 2013 à 16:57
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!


A voir également:

4 réponses

zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
28 janv. 2013 à 11:04
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
moreje2lyon Messages postés 21 Date d'inscription lundi 28 janvier 2013 Statut Membre Dernière intervention 26 mars 2015
28 janv. 2013 à 11:12
Merci...
malheureusement, malgré l'ajout des doubles ]
j'ai toujours
17 is not number
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
28 janv. 2013 à 11:13
On peut voir ton script complet ?
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
28 janv. 2013 à 11:16
Oups, j'avais pas fait attention au signe "==" ;-\

Il faut le remplacer par "=~"
0
moreje2lyon Messages postés 21 Date d'inscription lundi 28 janvier 2013 Statut Membre Dernière intervention 26 mars 2015
Modifié par moreje2lyon le 28/01/2013 à 11:19
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
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
28 janv. 2013 à 11:18
Voir message #4
0
moreje2lyon Messages postés 21 Date d'inscription lundi 28 janvier 2013 Statut Membre Dernière intervention 26 mars 2015
28 janv. 2013 à 11:26
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
Utilisateur anonyme
28 janv. 2013 à 14:10
salut,

sans regex :
[[ $v == +([0-9]) ]] && echo "is a number" || echo "is NOT a number"
0
moreje2lyon Messages postés 21 Date d'inscription lundi 28 janvier 2013 Statut Membre Dernière intervention 26 mars 2015
28 janv. 2013 à 16:51
merci,
mais là je ne suis pas assez familier à cette syntaxe pour l'intégrer dans ma boucle
0
moreje2lyon Messages postés 21 Date d'inscription lundi 28 janvier 2013 Statut Membre Dernière intervention 26 mars 2015
28 janv. 2013 à 16:49
merci!
existe il la construction inverse à

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


pour que le test soit valide quand il n'y a PAS que des chiffres?
merci
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
28 janv. 2013 à 16:57
T'enlève le "^" et le "$".
0