Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 16/04/2008, 14h59   #1
Membre confirmé
 
Inscription : avril 2008
Messages : 189
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 189
Points : 223
Points : 223
Par défaut Comment écrire un shell qui transforme un code ascii en caractère?

J'espère que je suis dans le bon forum car je n'ai pas trouvé de forum
dédié au shell (sh, csh ou bash).

Je voudrais écrire un shell (a priori Bourne) qui prenne en paramètre un nombre
et qui sorte sur la stdout le caractère dont le code ascii est ce nombre.

Par exemple, 48 (en hexa) == 110 (en octal) == 72 (en décimal)
est le code ascii du caractère "H" (hache majuscule).

Je voudrais écrire un shell "ascii2char" qui,
lorsqu'on lui passe en paramètre le nombre 48 (ou 110 ou 72, ça m'est égal)
écrive sur la stdout la lettre "H" (avec ou sans CR LF, ça m'est égal) :

Code :
1
2
3
4
5
% ascii2char 48
H
% ascii2char 48 | od -h
0000000  480a
0000002
J'ai réussi à le faire sans paramètre, par exemple pour les codes 001 et 110 en octal:

Code :
1
2
3
4
5
6
% CtrlA=`echo "A" | tr 'A' '\001'`
% C48=`echo "A" | tr 'A' '\110'`
 
% echo "${CtrlA}${C48}" | od -h
0000000  0148 0a00
0000003
Le line feed (0a) est généré par la commande "echo" elle-même,
mais "${CtrlA}" et "${C48}" contiennent bien juste les caractères de code 01H et 48H.

Code :
1
2
3
% echo "${CtrlA}${C48}" | od -c
0000000  001   H  \n
0000003
Mais, je n'arrive pas à le faire en utilisant un paramètre:

Code :
1
2
3
4
5
6
7
8
9
% HH=110
 
% echo "A" | tr 'A' "${HH}" | od -c
0000000    1  \n
0000002
 
% echo "A" | tr 'A' "\${HH}" | od -c
0000000    $  \n
0000002
Je pourrais même me contenter de:

mais, manifestement, le code n'est pas interprété comme étant de l'octal:

Code :
1
2
3
% echo ${HH} | od -c
0000000    \   1   1   0  \n
0000005
Quelqu'un saurait-il comment je peux faire?

Merci d'avance

)jack(
jack-ft est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/04/2008, 23h59   #2
Membre expérimenté
 
Avatar de BlaireauOne
 
Inscription : mars 2007
Messages : 469
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : mars 2007
Messages : 469
Points : 576
Points : 576
shell "ascii2char" :

Code :
1
2
3
4
5
6
7
8
 
#
# Une valeur hexadécimale DOIT commencer par un 0x ( exemple 0x48 )
# Une valeur octale       DOIT commencer par un 0  ( exemple 0110 )
# Une valeur décimale     DOIT commencer par un chiffre autre que 0 ( exemple 72 )
#
 
echo $1 | awk '{ if ($1 ~ /^0/) { printf("%c",strtonum($1)) } else { printf("%c\n",$1) }}'

ascii2char 0x48
H
ascii2char 0110
H
ascii2char 72
H

Ci-dessous, les explications nécessaires à la compréhension

http://www.delorie.com/gnu/docs/gawk/gawk_77.html
http://www.delorie.com/gnu/docs/gawk/gawk_64.html
__________________
Loi de Murphy:
La Théorie c'est quand ça ne marche pas mais que l'on sait pourquoi.
La Pratique c'est quand ça marche mais qu'on ne sait pas pourquoi.
Quand la théorie rejoint la pratique ça ne marche pas et on ne sait pas pourquoi.
BlaireauOne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2008, 11h08   #3
Membre confirmé
 
Inscription : avril 2008
Messages : 189
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 189
Points : 223
Points : 223
Citation:
Envoyé par BlaireauOne Voir le message
shell "ascii2char" :

Code :
1
2
3
4
5
6
7
8
 
#
# Une valeur hexadécimale DOIT commencer par un 0x ( exemple 0x48 )
# Une valeur octale       DOIT commencer par un 0  ( exemple 0110 )
# Une valeur décimale     DOIT commencer par un chiffre autre que 0 ( exemple 72 )
#
 
echo $1 | awk '{ if ($1 ~ /^0/) { printf("%c",strtonum($1)) } else { printf("%c\n",$1) }}'

ascii2char 0x48
H
ascii2char 0110
H
ascii2char 72
H

Ci-dessous, les explications nécessaires à la compréhension

http://www.delorie.com/gnu/docs/gawk/gawk_77.html
http://www.delorie.com/gnu/docs/gawk/gawk_64.html
Excellent!

beaucoup!

Honte à moi! Je n'avais pas pensé à regarder du côté de "awk" avec la possibilité de convertir et formater les nombres.

Encore merci.

)jack(

jack-ft est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2008, 17h51   #4
Membre confirmé
 
Inscription : avril 2008
Messages : 189
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 189
Points : 223
Points : 223
Citation:
Envoyé par BlaireauOne Voir le message
shell "ascii2char" :

Code :
1
2
3
4
5
6
7
8
 
#
# Une valeur hexadécimale DOIT commencer par un 0x ( exemple 0x48 )
# Une valeur octale       DOIT commencer par un 0  ( exemple 0110 )
# Une valeur décimale     DOIT commencer par un chiffre autre que 0 ( exemple 72 )
#
 
echo $1 | awk '{ if ($1 ~ /^0/) { printf("%c",strtonum($1)) } else { printf("%c\n",$1) }}'

ascii2char 0x48
H
ascii2char 0110
H
ascii2char 72
H

Ci-dessous, les explications nécessaires à la compréhension

http://www.delorie.com/gnu/docs/gawk/gawk_77.html
http://www.delorie.com/gnu/docs/gawk/gawk_64.html
Juste un détail: le "\n" n'est pas utile.

Code :
1
2
3
4
5
6
7
$ echo 72 | awk '{ if ($1 ~ /^0/) { printf("%c",strtonum($1)) } else { printf("%c\n",$1) }}' | od -c
0000000   H  \n
0000002
 
$ echo 72 | awk '{ if ($1 ~ /^0/) { printf("%c",strtonum($1)) } else { printf("%c",$1) }}' | od -c
0000000   H
0000001
Et c'est juste ce qu'il me fallait.

Re-merci.

Jacques
jack-ft est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h38.


 
 
 
 
Partenaires

Hébergement Web