IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Améliorer un if then + convertir un hexa en nombre


Sujet :

Shell et commandes GNU

  1. #1
    Invité
    Invité(e)
    Par défaut Améliorer un if then + convertir un hexa en nombre
    1) Améliorer un if then :

    Actuellement j'ai quelque chose comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if [ $1 == 1 ] || [ $1 == 12 ]
    then
    echo $1
    fi
    Cependant il y a beaucoup plus de condition (une vingtaine).
    Est-ce qu'il n'y a pas plus simple? J'avais pensé à un grep mais un "grep 2 $liste" ne marcherais pas ...

    2) convertir un hexa en nombre
    tmp contient la lettre E = 45 en hexa.
    45 en hexa = 69 en décimal, c'est ce dernier nombre que je souhaite récupérer.

    Pour l'instant je fais ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cat tmp | od -N 1 -i | head -1 | tr -s " " | cut -d " " -f 2
    Est-ce qu'il n'y a pas plus simple ?

  2. #2
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Citation Envoyé par Beginner.j Voir le message
    1) Améliorer un if then :

    Actuellement j'ai quelque chose comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if [ $1 == 1 ] || [ $1 == 12 ]
    then
    echo $1
    fi
    Cependant il y a beaucoup plus de condition (une vingtaine).
    Est-ce qu'il n'y a pas plus simple? J'avais pensé à un grep mais un "grep 2 $liste" ne marcherais pas ...
    Il y a peut-etre mieux, peut-etre pas, mais il faut nous expliquer ce que tu veux faire : c'est quoi $liste, quel est le rapport avec les valeurs 1 et 12 que tu testes, ...
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  3. #3
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Citation Envoyé par Beginner.j Voir le message
    1) Améliorer un if then :

    Actuellement j'ai quelque chose comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if [ $1 == 1 ] || [ $1 == 12 ]
    then
    echo $1
    fi
    Cependant il y a beaucoup plus de condition (une vingtaine).
    Est-ce qu'il n'y a pas plus simple? J'avais pensé à un grep mais un "grep 2 $liste" ne marcherais pas ...
    Tu peux faire la comparaison avec une expression régulière ou une expression générique.

    Expression régulière:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if echo "$1" | egrep -q -x '1*[23]\(4\|56\|789\)' ; then
    echo $1
    fi
    qui matche 24 124 11124 34 134 11134 256 1256 111256 etc.

    Expression générique:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if [[ "$1" = '*(1)[23]@(4|56|789)' ]] ; then
    echo $1
    fi
    qui matche la même chose (avec une syntaxe légèrement différente).
    ou bien avec un case, qui montre explicitement les valeurs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    case "$1" in
       24|124|1124|34|134) echo $1 ;;
    esac


    2) convertir un hexa en nombre
    tmp contient la lettre E = 45 en hexa.
    45 en hexa = 69 en décimal, c'est ce dernier nombre que je souhaite récupérer.

    Pour l'instant je fais ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cat tmp | od -N 1 -i | head -1 | tr -s " " | cut -d " " -f 2
    Est-ce qu'il n'y a pas plus simple ?
    Tu veux dire que tu veux convertir E (contenu du fichier 'tmp') en 69, c'est bien ça?

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par gangsoleil Voir le message
    Il y a peut-etre mieux, peut-etre pas, mais il faut nous expliquer ce que tu veux faire : c'est quoi $liste, quel est le rapport avec les valeurs 1 et 12 que tu testes, ...
    Je pensais à un truc comme ça mais ça ne fonctionne pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ liste="1 12"
    $ echo $liste | grep 2
    1 12
    Citation Envoyé par jack-ft Voir le message
    ...
    ou bien avec un case, qui montre explicitement les valeurs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    case "$1" in
       24|124|1124|34|134) echo $1 ;;
    esac
    Impeccable, je n'avais pas pensé à un "|" dans un case ...

    Citation Envoyé par jack-ft Voir le message
    Tu veux dire que tu veux convertir E (contenu du fichier 'tmp') en 69, c'est bien ça?
    Oui c'est bien ça.

  5. #5
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Alors, je ne vois qu'une solution (évidente):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ cat tmp
    E
     
    $ printf "%u" "'$(cat tmp)"
    69

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par jack-ft Voir le message
    Alors, je ne vois qu'une solution (évidente):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ cat tmp
    E
     
    $ printf "%u" "'$(cat tmp)"
    69
    Je savais bien que quelqu'un aurait une bonne idée, merci

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par jack-ft Voir le message
    Alors, je ne vois qu'une solution (évidente):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ cat tmp
    E
     
    $ printf "%u" "'$(cat tmp)"
    69
    Bizarre, pour les caractère hexa 00 à 09 ça fonctionne bien.
    0a bug, cela donne 0
    0b et les suivants fonctionnent à nouveau
    Et à partir de 80 ça donne à chaque fois 0
    Je n'y comprend rien

    Une idée d'où viens ce problème?

  8. #8
    Invité
    Invité(e)
    Par défaut
    Ancienne version:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cat tmp | od -N 1 -i | head -1 | tr -s " " | cut -d " " -f 2
    Finalement j'ai trouvé ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ cat tmp | od -An -i
              69
    $ cat tmp | od -An -tx1
     45
    Le 1er donne le nombre en décimal et le 2ème en hexadécimal.
    Bien qu'il y ai des espaces lors de l'affichage standard ça a l'air de marcher quand je l'affecte à des variables.

    Je ne sais plus où j'avais trouvé ça (ça date).
    Qui pourrait me donner une explication sur ces 2 points:
    - l’affectation dans une variable enlève les espace?
    - Dans le 2ème od, le "tx1" correspond à quel type d'hexadécimal? J'ai vu que le -x correspondait à -tx2 = "hexadecimal shorts". Mais là je suis perdu ...
    Merci d'avance.

    En tout cas ça fonctionne avec le 0a et les caractères 80+ donc je suis content

  9. #9
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 658
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 658
    Par défaut
    Citation Envoyé par Beginner.j
    l’affectation dans une variable enlève les espace?
    ferais-tu un echo $var, c'est-à-dire sans mettre la variable entre guillemets ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var="   bla   "
    echo $var-
    bla -  #tiens? il en reste un, à la fin. ??? c'est bizarre :(
    echo "${var}-"
       bla   -   #tiens? là, il n'y est pas. ???
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  10. #10
    Invité
    Invité(e)
    Par défaut
    Exact, et comme je faisais une opération avec le nombre décimal obtenu après c'était invisible dans mon test.
    Bon ben je rajoute un petit sed alors, c'est toujours plus simple de retrouver ce que fait ma ligne par rapport à ce que j'avais avant.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ cat tmp | od -An -i | sed 's/ //g'
    69
    $ cat tmp | od -An -tx1 | sed 's/ //g'
    45
    Sinon j'ai fait un petit test, les 3 commandes suivantes me rendent le code hexa. Ce qui change, c'est la longueur du texte
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ cat tmp | od -An -tx | sed 's/ //g'
    00000045
    $ cat tmp | od -An -tx2 | sed 's/ //g'
    0045
    $ cat tmp | od -An -tx1 | sed 's/ //g'
    45
    J'ai eu de la chance de retrouver le bon codage car il n'y a que le x et le tx2 d'indiqué dans le man

  11. #11
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Citation Envoyé par Beginner.j Voir le message
    Exact, et comme je faisais une opération avec le nombre décimal obtenu après c'était invisible dans mon test.
    Bon ben je rajoute un petit sed alors, c'est toujours plus simple de retrouver ce que fait ma ligne par rapport à ce que j'avais avant.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ cat tmp | od -An -i | sed 's/ //g'
    69
    $ cat tmp | od -An -tx1 | sed 's/ //g'
    45
    Pour ceux que ça intéresse, nous avons remarqué une différence de comportement de wc -l entre linux et AIX (due au formatage (présence d'espaces)).
    Pour déformater, il existe une alternative à sed -e 's/ //g', mais qui ne marche que pour les nombres (ce qui est ton cas), c'est le typage entier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ uname
    Linux
     
    $ echo a | wc -l | od -x 
    0000000 0a31
    0000002
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    $ uname
    AIX
     
    $ echo a | wc -l | od -x
    0000000  2020 2020 2020 2031 0a00
    0000011
     
    $ X=$(echo a | wc -l)
    $ echo "$X-"    
           1-
     
    $ typeset -i Y=$(echo a | wc -l)
    $ echo "$Y-"                    
    1-
     
    $ integer Z=$(echo a | wc -l)
    $ echo "$Z-" 
    1-

  12. #12
    Expert confirmé
    Avatar de becket
    Profil pro
    Informaticien multitâches
    Inscrit en
    Février 2005
    Messages
    2 854
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Informaticien multitâches
    Secteur : Service public

    Informations forums :
    Inscription : Février 2005
    Messages : 2 854
    Par défaut
    Si tu dois vérifier une liste de conditions, tu peux faire ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    found=0
    for i in $( < liste )
    do        
            if [ $found -eq 0 ] && [[ $1 -eq  $i ]]
            then
            echo $i
            found=1
            fi
    done

  13. #13
    Invité
    Invité(e)
    Par défaut
    @jack-ft: J'utilise cygwin mais l'idée de définir la variable en tant qu'entier est pas bête et fonctionne bien.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ cat tmp | od -An -i
              69
    $ declare -i X=`cat tmp | od -An -i`
    $ echo "$X"
    69

    @becket: J'utilise des listes avec les boucle for pour autre chose mais je n'avais pas pensé à utiliser une liste contenue dans un fichier. Ca va m'aider pour autre chose dans mon script.

    Le "case" est plus simple à gérer pour ce que je voulais faire car ta version est un peu complexe

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. existe t il une fonction pour convertir les %hexa
    Par jean-michel-78 dans le forum Langage
    Réponses: 2
    Dernier message: 02/03/2011, 09h26
  2. Réponses: 2
    Dernier message: 23/12/2009, 20h46
  3. [XSL --> HTML>Convertir code HEXA en caractère
    Par portu dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 23/04/2009, 11h26
  4. convertir couleur hexa en tcolor
    Par gregcat dans le forum Delphi
    Réponses: 2
    Dernier message: 30/01/2007, 11h51
  5. [MFC] convertir ascii->hexa
    Par r0d dans le forum MFC
    Réponses: 12
    Dernier message: 30/03/2005, 11h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo