En general, el shell podría comprender números hexadecimales, oct y decimales en variables, siempre que se hayan definido como 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
O son el resultado de una "Expansión Aritmética":
$ : $(( 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
Entonces, solo necesita una forma de imprimir el carácter que pertenece a un valor variable.
Pero aquí hay dos formas posibles:
$ var=$((0x65))
$ printf '%b\n' "\\$(printf '0%o' "$var")"
e
$ declare -i var
$ var=0x65; printf '%b\n' "\U$(printf '%08x' "$var")"
e
Se necesitan los dos printf, uno para transformar el valor en una cadena hexadecimal y el segundo para imprimir realmente el carácter.
El segundo imprimirá cualquier punto UNICODE (si su consola está configurada correctamente).
Por ejemplo:
$ var=0x2603; printf '%b\n' "\U$(printf '%08x' "$var")"
☃
Un hombre de nieve
El personaje que tiene una representación utf-8 como f0 9f 90 ae
es 0x1F42E
. Buscar cow face site:fileformat.info
a conseguirlo :
$ var=0x1F42F; printf '%b\n' "\U$(printf '%08x' "$var")"
🐮
Nota : Hay un problema con la forma UNICODE en que para bash antes de 4.3 (corregido en esa versión y hacia arriba), los caracteres entre UNICODE puntos 128 y 255 (en decimal) pueden imprimirse incorrectamente.
Referencias
Cuarto párrafo adentro PARAMETERS
en man bash
:
Si la variable tiene su conjunto de atributos enteros, entonces el valor se evalúa como una expresión aritmética incluso si no se usa la expansión $ ((...)) (ver Expansión aritmética a continuación).
Dentro de "EVALUACIÓN ARITMÉTICA" en man bash
:
Las constantes con un 0 inicial se interpretan como números octales. Un 0x o 0X inicial denota hexadecimal. De lo contrario, los números toman la forma [base #] n, donde la base opcional es un número decimal entre 2 y 64 que representa la base aritmética, yn es un número en esa base. Si se omite la base #, se utiliza la base 10. Los dígitos mayores que 9 están representados por las letras minúsculas, las letras mayúsculas, @ y _, en ese orden. Si la base es menor o igual a 36, las letras minúsculas y mayúsculas se pueden usar indistintamente para representar números entre 10 y 35.