En général, le shell peut comprendre les nombres hexadécimaux, octaux et décimaux dans les variables, à condition qu'ils soient définis comme integers
:
$ declare -i v1 v2 v3 v4 v5 v6 v7
$ v1=0112
$ v2=74
$ v3=0x4a
$ v4=8#112
$ v5=10#74
$ v6=16#4a
$ v7=18#gg
echo "$v1 $v2 $v3 $v4 $v5 $v6 $v7"
74 74 74 74 74 74 304
Ou ils sont le résultat d'une "expansion arithmétique":
$ : $(( v1=0112, v2=74, v3=0x4a, v4=8#112, v5=10#74, v6=16#4a, v7=18#gg ))
$ echo "$v1 $v2 $v3 $v4 $v5 $v6 $v7"
74 74 74 74 74 74 304
Ainsi, vous avez juste besoin d'une façon d'imprimer le caractère qui appartient à une valeur de variable.
Mais voici deux manières possibles:
$ var=$((0x65))
$ printf '%b\n' "\\$(printf '0%o' "$var")"
e
$ declare -i var
$ var=0x65; printf '%b\n' "\U$(printf '%08x' "$var")"
e
Les deux printf sont nécessaires, l'un pour transformer la valeur en une chaîne hexadécimale et le second pour réellement imprimer le caractère.
Le second imprimera n'importe quel point UNICODE (si votre console est correctement définie).
Par exemple:
$ var=0x2603; printf '%b\n' "\U$(printf '%08x' "$var")"
☃
Un bonhomme de neige.
Le caractère qui a une représentation UTF-8 f0 9f 90 ae
est 0x1F42E
. Rechercher cow face site:fileformat.info
pour obtenir :
$ var=0x1F42F; printf '%b\n' "\U$(printf '%08x' "$var")"
🐮
Remarque : Il y a un problème avec la manière UNICODE en ce que pour bash avant 4.3 (corrigé dans cette version et vers le haut), les caractères entre les points UNICODE 128 et 255 (en décimal) peuvent être imprimés incorrectement.
Références
Quatrième paragraphe à l'intérieur PARAMETERS
de man bash
:
Si la variable a son attribut entier défini, la valeur est évaluée comme une expression arithmétique même si l'expansion $ ((...)) n'est pas utilisée (voir Expansion arithmétique ci-dessous).
Dans "ÉVALUATION ARITHMÉTIQUE" en man bash
:
Les constantes avec un 0 en tête sont interprétées comme des nombres octaux. Un 0x ou 0X en tête indique hexadécimal. Sinon, les nombres prennent la forme [base #] n, où la base facultative est un nombre décimal compris entre 2 et 64 représentant la base arithmétique, et n est un nombre dans cette base. Si la base # est omise, la base 10 est utilisée. Les chiffres supérieurs à 9 sont représentés par les lettres minuscules, les lettres majuscules, @ et _, dans cet ordre. Si la base est inférieure ou égale à 36, les lettres minuscules et majuscules peuvent être utilisées de manière interchangeable pour représenter des nombres compris entre 10 et 35.