Конкретно есть интерес — как можно переводить и узнавать номера символов в различных системах счисления.
Ну смотри, давай выведем значения номеров символа английского алфавита в кодировке ASCII (шестнадцатеричные, восьмеричные, десятичные). Возьмем за эталон символ «S».
В bash это можно провернуть таким способом:
printf 'Hex : %x Oct : %o Dec : %d\n' "'"S{,,}
printf 'Hex : %x Oct : %o Dec : %d\n' '"'S{,,}
printf 'Hex : %x Oct : %o Dec : %d\n' \'S{,,}
printf 'Hex : %x Oct : %o Dec : %d\n' \"S{,,}Получим:
Hex : 53 Oct : 123 Dec : 83
Это специальный синтаксис команды printf. Если перед символом «S» идет одинарная кавычка, или двойная кавычка, то значение будет номером символа.
Такой синтаксис появился в bash с версии 2.05a. Added support for builtin printf "'" flag character as per latest POSIX drafts.
Аналогично можно узнать номер символа в многобайтовой кодировке UTF-8.
Например, так:
printf 'Hex : %x Oct : %o Dec : %d\n' '"'Я{,,}На всю эту чачу влияют переменные окружения LC_CTYPE и LC_ALL. Ща покажу. Запускаем такое:
( LC_ALL=C ; chunks="Сёма" ; echo ${chunks:0:1}${chunks:3} )Кодировка сломалась, на экран вывелось «Бма». Мы получили доступ к байтам, а не к символам UTF-8 кодировки. Второй байт символа «С» отправляется на помойку и аналогично первый «ё». По итогу вместо «Сёма» мы получили «Бма».
Установка LC_ALL=C может использоваться для обеспечения непрерывности в работе программы, независимо от языковых настроек окружающей среды. Это может быть полезно, если вам нужно гарантировать, что вывод программы или результат выполнения команды не зависит от текущей локали системы.
Если интересно более глубже погрузиться в весь этот 3.14здец UTF-8, можешь прочитать эту замечательную статью.
Так, опять от темы ушли. Наверняка тебя интересует, что означает конструкция {,,}. Это бородатый хак, который дублирует строки.
echo bashdays{,,,}На выходе получим 4 раза слово bashdays. Ничего сложного. Бери на заметку, хак полезный.
А еще команда printf, позволяет присвоить результат переменной. Делается это так:
printf -v var 'Hex : %x Oct : %o Dec : %d\n' '"'Ж{,,}
echo "$var"Пока на этом всё. Больше не смею тебя мучить этими ужасными вещами! Увидимся завтра.
tags: #linux #bash
—
💩 @bashdays