Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

verifier chaine hexa dans une variable sous script sh

10 réponses
Avatar
Michel
bonjour a tous.

j'ai un script sh et j'y connais pas grand chose... donc je bricole...et
j'apprends...

J'ai une variable qui contient une chaine hexa de 16 octets de type :

541DDC39F2B34CF5C6CAD8A36BD05358

Mais parfois, la variable se rempli de codes parasites.

Quelqu'un saurait comment faire un test qui vérifie que la variable contient
bien la chaine hexa de 16 octets sans espace entre les octets ? (genre un
test qui verifie la taille de la chaine... et qui vérifie qu'il n'y a pas de
caracteres différents de chiffres et de lettres ABCD suffirait...)

Je sais faire ca en basic, en C, en php mais pas en script sh... (mais
j'apprends vite..j'ai deja beaucoup appris grace à ce script et des sites
internet)

Merci.

10 réponses

Avatar
Christophe Gaubert

Quelqu'un saurait comment faire un test qui vérifie que la variable
contient bien la chaine hexa de 16 octets sans espace entre les
octets ? (genre un test qui verifie la taille de la chaine... et qui
vérifie qu'il n'y a pas de caracteres différents de chiffres et de
lettres ABCD suffirait...)


Bon, je me lance. J'espère avoir bien compris ce que tu voulais. Au
fait, j'ai inclus les lettres jusqu'à F, bien que tu disais seulement
ABCD...

#!/bin/sh

estHexa() {
# teste si $1 est une "chaine hexa"
x=${1//[0-9A-F]}
test -z "$x" -a "${#1}" -eq 32

}

var='541DDC39F2B342CF5C6CAD8A3BD05358'

if $(estHexa "$var") ; then
echo "est hexa"
else
echo "pas hexa"
fi


--
Christophe Gaubert

Avatar
lhabert
"Michel" :

Quelqu'un saurait comment faire un test qui vérifie que la variable contient
bien la chaine hexa de 16 octets sans espace entre les octets ? (genre un
test qui verifie la taille de la chaine... et qui vérifie qu'il n'y a pas de
caracteres différents de chiffres et de lettres ABCD suffirait...)


case $PLOUM in
????????????????)
case $PLOUM in
*[^0-9A-F]*) # erreur (contient un caractère qui n'est ni un chiffre ni
# un A..F)
;;
*) # correct
;;
esac
*) # erreur (pas 16 caractères)
;;
esac

Avatar
Michel
"Luc Habert" a écrit dans le message de news:
e64vbd$2qba$
"Michel" :

Quelqu'un saurait comment faire un test qui vérifie que la variable
contient
bien la chaine hexa de 16 octets sans espace entre les octets ? (genre
un
test qui verifie la taille de la chaine... et qui vérifie qu'il n'y a pas
de
caracteres différents de chiffres et de lettres ABCD suffirait...)


case $PLOUM in
????????????????)
case $PLOUM in
*[^0-9A-F]*) # erreur (contient un caractère qui n'est ni un chiffre
ni
# un A..F)
;;
*) # correct
;;
esac
*) # erreur (pas 16 caractères)
;;
esac


Merci de vos réponses.

Dans ce code, ne faut il pas faire une boucle ?

Merci.


Avatar
lhabert
Christophe Gaubert :

x=${1//[0-9A-F]}
test -z "$x" -a "${#1}" -eq 32


Ces deux lignes ne sont pas du sh, contrairement à ce qu'indique ton
« #!/bin/sh ».

if $(estHexa "$var") ; then


Non, là, tu lui dis d'exécuter « estHexa "$var" », de récupérer la sortie
standard (qui va être vide en l'occurence), de la splitter sur les
caractères contenus dans la variable IFS, d'interpréter chacun des mots
obtenus comme un pattern, de remplacer ceux qui matchent des noms de
fichiers par les noms de fichiers en question, et enfin d'exécuter le tout
comme une commande.

C'est « if estHexa "$var"; then » que tu voulais dire,

Avatar
lhabert
"Michel" :

Dans ce code, ne faut il pas faire une boucle ?


Euh, tu voudrais faire quoi comme boucle? Je teste en premier si il y a
exactement 16 caractères dans la string en regardant si elle vérifie le
motif « ???????????????? » (chaque « ? » matche un unique caractère
quelconque, donc en en mettant 16, on matche toutes les chaines d'exactement
16 caractères), puis, je teste si elle contient autre chose que des chiffres
et des lettres de A à F en regardant si elle vérifie le motif
« *[^0-9A-F]* » (le motif « [^0-9A-F] » matche tous les caractères qui ne
sont pas entre 0 et 9 ni entre A et F (bon, en fait, j'aurais mieux fait de
dire « [^0123456789ABCDEF] », parce que l'ordre considéré n'est pas
forcément l'ordre ASCII (grmbl de LC_COLLATE de merde)), donc si on ajoute
une étoile devant et derrière (une étoile matche n'importe quoi) on obtient
un motif qui matche toute chaine contenant un caractère autre que
0123456789ABCDEF).

Avatar
Christophe Gaubert

Christophe Gaubert :

x=${1//[0-9A-F]}
test -z "$x" -a "${#1}" -eq 32


Ces deux lignes ne sont pas du sh, contrairement à ce qu'indique ton
« #!/bin/sh ».


Oups. J'oublie à chaque fois que c'est spécifique à bash...

if $(estHexa "$var") ; then


Non, là, tu lui dis d'exécuter « estHexa "$var" », de récupérer la
sortie standard (qui va être vide en l'occurence), de la splitter sur
les caractères contenus dans la variable IFS, d'interpréter chacun
des mots obtenus comme un pattern, de remplacer ceux qui matchent des
noms de fichiers par les noms de fichiers en question, et enfin
d'exécuter le tout comme une commande.


Mm, mais pourtant, ça fonctionnait sur les tests que j'ai fait.

C'est « if estHexa "$var"; then » que tu voulais dire,


C'est ce que j'avais écrit dans ma première ébauche, et puis il y avait
une erreur de syntaxe, ailleurs...

Merci d'avoir pris le temps de me corriger.

--
Christophe Gaubert


Avatar
Christophe Gaubert

Je teste en premier si il y a
exactement 16 caractères dans la string en regardant si elle vérifie
le motif « ???????????????? »


D'après la chaîne que l'OP a donné en exemple, la longueur va plutôt
être 32 caractères. Puisque les chiffres hexa tiennent sur 4 bits et
qu'il a une chaine de 16 octets.

Enfin, c'est ce que j'ai cru comprendre.

En tout cas, c'est pas bête de vérifier la longueur avec un case, mais
je trouve ça un peu dangereux. Je veux dire, ça ne saute pas aux yeux
qu'il y a bien exactement 16 '?'.


--
Christophe Gaubert

Avatar
Stephane Chazelas
2006-06-6, 23:51(+02), Michel:
bonjour a tous.

j'ai un script sh et j'y connais pas grand chose... donc je bricole...et
j'apprends...

J'ai une variable qui contient une chaine hexa de 16 octets de type :

541DDC39F2B34CF5C6CAD8A36BD05358
[...]


if expr "x$var" : "x[0-9A-F]{16}$" > /dev/null; then
echo OK
else
echo not OK
fi

--
Stéphane

Avatar
lhabert
Christophe Gaubert :

D'après la chaîne que l'OP a donné en exemple, la longueur va plutôt
être 32 caractères. Puisque les chiffres hexa tiennent sur 4 bits et
qu'il a une chaine de 16 octets.


Ah... Moi j'avais compris que c'était une fois encodée que la chaine faisait
16 octets, et je ne m'étais pas amusé à compter le nombre de caractères dans
son exemple. Enfin bon, ma méthode est triviale à adapter à 32 caractères.

En tout cas, c'est pas bête de vérifier la longueur avec un case, mais
je trouve ça un peu dangereux. Je veux dire, ça ne saute pas aux yeux
qu'il y a bien exactement 16 '?'.


Bah c'est pas super dur à compter non plus.

Avatar
Pascal Bourguignon
Christophe Gaubert writes:
En tout cas, c'est pas bête de vérifier la longueur avec un case, mais
je trouve ça un peu dangereux. Je veux dire, ça ne saute pas aux yeux
qu'il y a bien exactement 16 '?'.


Quoi ? Tu ne sais pas compter en base 1 ???

--
__Pascal Bourguignon__ http://www.informatimago.com/
In deep sleep hear sound,
Cat vomit hairball somewhere.
Will find in morning.