Em geral, o shell pode entender números hex, oct e decimais em variáveis, desde que tenham sido definidos 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
Ou são o resultado de uma "Expansão 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
Portanto, você só precisa de uma maneira de imprimir o caractere que pertence a um valor variável.
Mas aqui estão duas maneiras possíveis:
$ var=$((0x65))
$ printf '%b\n' "\\$(printf '0%o' "$var")"
e
$ declare -i var
$ var=0x65; printf '%b\n' "\U$(printf '%08x' "$var")"
e
Os dois printf são necessários, um para transformar o valor em uma sequência hexadecimal e o segundo para realmente imprimir o caractere.
O segundo imprimirá qualquer ponto UNICODE (se o console estiver configurado corretamente).
Por exemplo:
$ var=0x2603; printf '%b\n' "\U$(printf '%08x' "$var")"
☃
Um homem da neve.
O caractere que possui uma representação utf-8 como f0 9f 90 ae
está 0x1F42E
. Procurar cow face site:fileformat.info
para obtê-lo :
$ var=0x1F42F; printf '%b\n' "\U$(printf '%08x' "$var")"
🐮
Nota : Há um problema com a maneira UNICODE no bash anterior a 4.3 (corrigido nessa versão e acima), os caracteres entre os pontos 128 e 255 do UNICODE (em decimal) podem ser impressos incorretamente.
Referências
Quarto parágrafo dentro PARAMETERS
de man bash
:
Se a variável tiver seu atributo inteiro definido, o valor será avaliado como uma expressão aritmética, mesmo que a expansão $ ((...)) não seja usada (consulte Expansão aritmética abaixo).
Dentro de "AVALIAÇÃO ARITMÉTICA" em man bash
:
As constantes com um 0 inicial são interpretadas como números octais. Um 0x ou 0X inicial indica hexadecimal. Caso contrário, os números assumem a forma [base #] n, onde a base opcional é um número decimal entre 2 e 64 representando a base aritmética, e n é um número nessa base. Se o número da base for omitido, a base 10 será usada. Os dígitos maiores que 9 são representados pelas letras minúsculas, maiúsculas, @ e _, nessa ordem. Se a base for menor ou igual a 36, as letras minúsculas e maiúsculas poderão ser usadas alternadamente para representar números entre 10 e 35.