TGViewer
Bash Days | Linux | DevOps Bash Days | Linux | DevOps @bashdays · 23.6K subscribers
Post #198 10.6K
Привет. Много вопросов поступило про ASCII после моего демонического поста. Этот пост будет не лучше, крепись🙂

Конкретно есть интерес — как можно переводить и узнавать номера символов в различных системах счисления.

Ну смотри, давай выведем значения номеров символа английского алфавита в кодировке 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
  • 👍 77
More from @bashdays
  1. Sep 29, 2026Самый жаркий холивар в команде — это не systemd, а какие заказать роллы на всю команду. Од…
  2. Sep 24, 2026Post #1565
  3. Sep 23, 2026Здрасти приехали, решил я в кой-то веке воспользоваться услугами Codex, создал аккаунт, по…
  4. Sep 22, 2026Всем привет, с вами TagdTagd. Сегодня опять поднимем тему архивов, но немного с другой сто…
  5. Sep 15, 2026Всем привет, с вами TagdTagd. И это вторая часть. Практическая. С первой частью можешь озн…
  6. Sep 9, 2026Всем привет, с вами TagdTagd! Я тут вынужденно перешёл на MAX. Просто Telegram перестал ра…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →