Secara umum, shell dapat memahami hex, oct dan angka desimal dalam variabel, asalkan telah didefinisikan sebagai 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
Atau mereka adalah hasil dari "Ekspansi Aritmatika":
$ : $(( 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
Jadi, Anda hanya perlu satu cara untuk mencetak karakter yang memiliki nilai variabel.
Tapi di sini ada dua cara yang mungkin:
$ var=$((0x65))
$ printf '%b\n' "\\$(printf '0%o' "$var")"
e
$ declare -i var
$ var=0x65; printf '%b\n' "\U$(printf '%08x' "$var")"
e
Dua printf diperlukan, satu untuk mengubah nilai menjadi string heksadesimal dan yang kedua untuk benar-benar mencetak karakter.
Yang kedua akan mencetak titik UNICODE (jika konsol Anda diatur dengan benar).
Sebagai contoh:
$ var=0x2603; printf '%b\n' "\U$(printf '%08x' "$var")"
☃
Manusia salju.
Karakter yang memiliki representasi utf-8 apa f0 9f 90 ae
adanya 0x1F42E
. Mencari cow face site:fileformat.info
untuk mendapatkannya :
$ var=0x1F42F; printf '%b\n' "\U$(printf '%08x' "$var")"
🐮
Catatan : Ada masalah dengan cara UNICODE untuk bash sebelum 4.3 (dikoreksi dalam versi itu dan ke atas), karakter antara UNICODE titik 128 dan 255 (dalam desimal) mungkin dicetak secara tidak benar.
Referensi
Paragraf keempat di PARAMETERS
dalam man bash
:
Jika variabel memiliki set atribut integernya, maka nilai dievaluasi sebagai ekspresi aritmatika bahkan jika ekspansi $ ((...)) tidak digunakan (lihat Ekspansi Aritmatika di bawah).
Di dalam "EVALUASI ARITHMETIC" di man bash
:
Konstanta dengan awalan 0 ditafsirkan sebagai angka oktal. Sebuah 0x atau 0X terkemuka menunjukkan heksadesimal. Kalau tidak, angka-angkanya mengambil bentuk [basis #] n, di mana basis opsional adalah angka desimal antara 2 dan 64 yang mewakili basis aritmatika, dan n adalah angka dalam basis itu. Jika basis # dihilangkan, maka basis 10 digunakan. Digit lebih besar dari 9 diwakili oleh huruf kecil, huruf besar, @, dan _, dalam urutan itu. Jika basis kurang dari atau sama dengan 36, huruf kecil dan huruf besar dapat digunakan secara bergantian untuk mewakili angka antara 10 dan 35.