Ogólnie rzecz biorąc, powłoka może zrozumieć liczby szesnastkowe, ósemkowe i dziesiętne w zmiennych, pod warunkiem że zostały one zdefiniowane jako 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
Lub są wynikiem „rozszerzenia arytmetycznego”:
$ : $(( 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
Potrzebujesz tylko jednego sposobu, aby wydrukować znak należący do wartości zmiennej.
Ale są dwa możliwe sposoby:
$ var=$((0x65))
$ printf '%b\n' "\\$(printf '0%o' "$var")"
e
$ declare -i var
$ var=0x65; printf '%b\n' "\U$(printf '%08x' "$var")"
e
Potrzebne są dwa printf, jeden do przekształcenia wartości w łańcuch szesnastkowy, a drugi do wydrukowania znaku.
Drugi wydrukuje dowolny punkt UNICODE (jeśli konsola jest poprawnie ustawiona).
Na przykład:
$ var=0x2603; printf '%b\n' "\U$(printf '%08x' "$var")"
☃
Śnieżny człowiek.
Postać, która ma reprezentację utf-8 taką, jaka f0 9f 90 ae
jest 0x1F42E
. Wyszukaj, cow face site:fileformat.info
aby uzyskać :
$ var=0x1F42F; printf '%b\n' "\U$(printf '%08x' "$var")"
🐮
Uwaga : Występuje problem ze sposobem UNICODE polegający na tym, że w przypadku bash przed 4.3 (poprawionym w tej wersji i wyżej), znaki między punktami UNICODE 128 i 255 (dziesiętnie) mogą być niepoprawnie wydrukowane.
Bibliografia
Czwarty akapit PARAMETERS
w man bash
:
Jeśli zmienna ma ustawiony atrybut liczby całkowitej, wówczas wartość jest obliczana jako wyrażenie arytmetyczne, nawet jeśli nie jest używane rozwinięcie $ ((...)) (patrz rozwinięcie arytmetyczne poniżej).
Wewnątrz „OCENY ARYTETYCZNEJ” w man bash
:
Stałe z wiodącym 0 są interpretowane jako liczby ósemkowe. Początkowe 0x lub 0X oznacza liczbę szesnastkową. W przeciwnym razie liczby przyjmują postać [podstawa #] n, gdzie opcjonalna podstawa jest liczbą dziesiętną między 2 a 64 reprezentującą podstawę arytmetyczną, a n jest liczbą w tej podstawie. Jeśli baza nr zostanie pominięta, zostanie użyta baza 10. Cyfry większe niż 9 są reprezentowane przez małe litery, wielkie litery @ i _ w tej kolejności. Jeśli podstawa jest mniejsza lub równa 36, małe i wielkie litery mogą być używane zamiennie do reprezentowania liczb od 10 do 35.