В общем, оболочка может понимать шестнадцатеричные, октальные и десятичные числа в переменных при условии, что они определены как 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
Или они являются результатом «арифметического расширения»:
$ : $(( 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
Итак, вам просто нужен один способ напечатать символ, который принадлежит значению переменной.
Но вот два возможных пути:
$ var=$((0x65))
$ printf '%b\n' "\\$(printf '0%o' "$var")"
e
$ declare -i var
$ var=0x65; printf '%b\n' "\U$(printf '%08x' "$var")"
e
Необходимы два printf: один для преобразования значения в шестнадцатеричную строку, а второй для фактической печати символа.
Второй выводит любую точку UNICODE (если ваша консоль установлена правильно).
Например:
$ var=0x2603; printf '%b\n' "\U$(printf '%08x' "$var")"
☃
Снежный человек.
Символ, который имеет представление utf-8 как f0 9f 90 ae
есть 0x1F42E
. Ищите, cow face site:fileformat.info
чтобы получить это :
$ var=0x1F42F; printf '%b\n' "\U$(printf '%08x' "$var")"
🐮
Примечание . Проблема, связанная со способом UNICODE, заключается в том, что для bash до версии 4.3 (исправлено в этой версии и выше) символы между точками UNICODE 128 и 255 (в десятичном формате) могут быть напечатаны неправильно.
Ссылки
Четвертый абзац внутри PARAMETERS
в man bash
:
Если переменная имеет свой целочисленный атрибут, то значение оценивается как арифметическое выражение, даже если расширение $ ((...)) не используется (см. Арифметическое расширение ниже).
Внутри "АРИФМЕТИЧЕСКАЯ ОЦЕНКА" в man bash
:
Константы с ведущим 0 интерпретируются как восьмеричные числа. Ведущий 0x или 0X обозначает шестнадцатеричное. В противном случае числа принимают форму [base #] n, где необязательное основание - это десятичное число от 2 до 64, представляющее арифметическое основание, а n - это число в этом основании. Если база # опущена, то используется база 10. Цифры больше 9 представлены строчными буквами, заглавными буквами @ и _ в указанном порядке. Если основание меньше или равно 36, строчные и прописные буквы могут использоваться взаимозаменяемо для представления чисел от 10 до 35.