[shell] type d'une variable ??

younes -  
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   -
comment puis je savoir le type d'une variable saisie par le clavier :

echo "donner x :"
read x

quel est le type de x ??

& merci

ou bien tt simplement comment puisje verifier qu'une variable est numerique ? merci encors

5 réponses

  1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,
    #!/bin/sh 
    expr $var + 0 1>/dev/null 2>&1; statut=$? 
    if test $statut -lt 2 
    then 
         echo "$var" numérique 
    fi
    lami20j
    2
  2. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    Les variables n'ont pas de types en shell (en fait ce sont toutes des chaines).
    Le mieux c'est de tester avec une expression régulière par exemple avec sed.

    Bonne chance
    0
  3. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    Astucieux :)
    0
    1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
       
      Salut,

      j'ai savais de l'existence de la variable $? du shell (et l'idée de tester le rétour d'une addition d'une chaîne avec un nombre m'a traversée l'esprit), mais j'étais au boulot, je n'avais pas la possibilité de tester.
      Donc j'ai cherché sur net (j'ai l'habitude ;-)) et j'ai trouvé ce code dans un forum :-))

      lami20j
      0
  4. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Je trouve aussi ;-))

    Sinon on peut faire avec "grep" :
    if [ "$(echo $var | grep "^:digit:*$")" ]; then echo "La chaîne est numérique"; fi
    J'avais aussi ça dans mes tablettes :
    [ $var -eq 0 ] 2> /dev/null
    if [ $? -eq 0 -o $? -eq 1 ]
    then 
    echo "La chaîne est numérique"
    fi
    ;-))
    0
    1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
       
      Salut,

      j'attendais plutôt ta solution :-)) (c'est normal n'est-ce pas? :-)))))))

      en revanche quand je teste je n'ai pas le résultat attendu.

      Je suppose que tu as testé.
      J'ai peut être loupé quelque chose?!

      lami20j
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    ;-\

    Script avec "grep" :
    [jp@MDK tmpfs]$ cat essai_grep.sh
    
    #!/bin/bash
    # essai_grep.sh
    
    var=$1
    if [ "$(echo $var | grep "^:digit:*$")" ]
    then
    echo "La chaîne est numérique"
    fi
    
    [jp@MDK tmpfs]$ ./essai_grep.sh 123
    La chaîne est numérique
    
    [jp@MDK tmpfs]$ ./essai_grep.sh 123a
    [jp@MDK tmpfs]$ ./essai_grep.sh k123a
    [jp@MDK tmpfs]$ ./essai_grep.sh azerty
    [jp@MDK tmpfs]$ ./essai_grep.sh azerty12
    
    [jp@MDK tmpfs]$ ./essai_grep.sh 1
    La chaîne est numérique
    
    [jp@MDK tmpfs]$


    Avec "test" ([ ]):
    [jp@MDK tmpfs]$ cat essai_test.sh
    
    #!/bin/bash
    # essai_test.sh
    
    var=$1
    [ $var -eq 0 ] 2> /dev/null
    if [ $? -eq 0 -o $? -eq 1 ]
    then
    echo "La chaîne est numérique"
    fi
    
    [jp@MDK tmpfs]$ ./essai_test.sh 123
    La chaîne est numérique
    
    [jp@MDK tmpfs]$ ./essai_test.sh azerty
    [jp@MDK tmpfs]$ ./essai_test.sh aze123rty
    [jp@MDK tmpfs]$ ./essai_test.sh 123azerty
    
    [jp@MDK tmpfs]$ ./essai_test.sh 1
    La chaîne est numérique
    
    [jp@MDK tmpfs]$ 
    J'ai pas de soucis ;-))
    0
    1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
       
      Re,

      je ne sais pas pour quel raison chez moi ça ne marche pas.
      que toi, tu n'as pas de soucis, c'est normal, c'est toi le maître:-)

      En revanche je propose (ah, oui Miss, cette fois c'est ma solution :-)), je vais arrêter le plagiat :-))
      #!/bin/sh
      var=$1
      if let $var 2>/dev/null 
      then
        echo "$var numérique"
      else
        echo "$var non numérique"
      fi
      lami20j
      0
      1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898 > lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention  
         
        Châpeau bas maître kanji ;-))
        0
      2. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898 > lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention  
         
        J'ai trouvé pourquoi ça ne marche pas chez toi, tout simplement parce que le (nouveau) formatage des pages sur CCM m'efface mes "doubles crochets" (ouvrants et fermants) autour de l'expression :
        [ [:digit:] ]
        Évidemment il ne faut pas d'espace entre les deux crochets et du coup l'expression dans le script doit ressembler à :
        if [ "$(echo $var | grep "^[ [:digit:] ]*$")" ]
        toujours sans les espaces entre les crochets...

        ;-))
        0