In generale, la shell potrebbe comprendere numeri esadecimali, ottici e decimali in variabili, a condizione che siano stati definiti come 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
Oppure sono il risultato di una "espansione aritmetica":
$ : $(( 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
Quindi, hai solo bisogno di un modo per stampare il carattere che appartiene a un valore variabile.
Ma qui ci sono due modi possibili:
$ var=$((0x65))
$ printf '%b\n' "\\$(printf '0%o' "$var")"
e
$ declare -i var
$ var=0x65; printf '%b\n' "\U$(printf '%08x' "$var")"
e
Sono necessari i due printf, uno per trasformare il valore in una stringa esadecimale e il secondo per stampare effettivamente il carattere.
Il secondo stamperà qualsiasi punto UNICODE (se la tua console è impostata correttamente).
Per esempio:
$ var=0x2603; printf '%b\n' "\U$(printf '%08x' "$var")"
☃
Un uomo di neve.
Il personaggio che ha una rappresentazione utf-8 come f0 9f 90 ae
è 0x1F42E
. Cerca cow face site:fileformat.info
per ottenerlo :
$ var=0x1F42F; printf '%b\n' "\U$(printf '%08x' "$var")"
🐮
Nota : c'è un problema con il modo UNICODE in quanto per bash prima della 4.3 (corretto in quella versione e verso l'alto), i caratteri tra i punti UNICODE 128 e 255 (in decimale) potrebbero essere stampati in modo errato.
Riferimenti
Quarto paragrafo all'interno PARAMETERS
di man bash
:
Se la variabile ha l'attributo intero impostato, il valore viene valutato come espressione aritmetica anche se l'espansione $ ((...)) non viene utilizzata (vedere Espansione aritmetica di seguito).
All'interno di "VALUTAZIONE ARITMETICA" in man bash
:
Le costanti con uno 0 iniziale sono interpretate come numeri ottali. Uno 0x o 0X iniziale indica esadecimale. Altrimenti, i numeri assumono la forma [base #] n, dove la base opzionale è un numero decimale compreso tra 2 e 64 che rappresenta la base aritmetica e n è un numero in quella base. Se la base # viene omessa, viene utilizzata la base 10. Le cifre superiori a 9 sono rappresentate dalle lettere minuscole, dalle lettere maiuscole, @ e _, in quell'ordine. Se la base è inferiore o uguale a 36, le lettere minuscole e maiuscole possono essere utilizzate in modo intercambiabile per rappresentare numeri compresi tra 10 e 35.