Толик Панков
hex_laden
............ .................. ................
October 2025
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

BASH: Получить номер буквы в латинском алфавите, более элегантное решение.

В комментариях предложили более элегантное решение этой задачки.

#!/bin/bash

code=`printf '%d' \'$1`
a_code=`printf '%d' \'a`
answer=$( expr $code - $a_code )
echo $answer


Разберем код подробно.


1. printf - команда, выводящая текст (обычно на экран), с учетом заданной форматирующей строки. Подробнее о команде printf можно почитать в источниках, а вообще башевский printf, является аналогом printf из C++, и ее рекомендуют для замены древней команды echo в bash-скриптах.

Первым параметром является строка, описывающая формат, в данном случае '%d' означает, что нужно вывести десятичное число.
Второй параметр - выводимая строка.
Перед вторым параметром добавляется символ ' (одна одинарная кавычка): Интерпретируется как кодовый номер этой буквы в текущей кодировке [1], одинарную кавычку экранируем символом \.

Таким образом, в переменной code окажется код первого символа из первого параметра командной строки скрипта.

2. Далее, таким же образом, получаем код первой буквы в алфавите.
3. В итоге, получаем номер буквы в алфавите, посчитав выражение с помощью оператора expr [2]

Примечания


1. Этот код не будет работать на некоторых довольно странных устройствах, где кодовая таблица латинского алфавита представляет собой перемежающиеся заглавные и строчные буквы: AaBbCcDd и т.д. (или aAbBcCdD...)
2. Чтобы отсчет букв шел с единицы, необходимо изменить выражение answer=$( expr $code - $a_code ) на

answer=$( expr $code - $a_code + 1 )
3. С кириллицей этот способ не сработает, используйте предыдущий

По вкусу можно добавить проверки, как в предыдущем скрипте.

Готовый скрипт


На GitHub
На PasteBin

Дополнительно


1. Статья про printf
2. Описание оператора expr

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2019/06/04/bash-poluchit-nomer-bukvy-v-latinskom-alfavite-bolee-elegantnoe-reshenie/

From:
(will be screened)
Identity URL: 
имя пользователя:    
Вы должны предварительно войти в LiveJournal.com
 
E-mail для ответов: 
Вы сможете оставлять комментарии, даже если не введете e-mail.
Но вы не сможете получать уведомления об ответах на ваши комментарии!
Внимание: на указанный адрес будет выслано подтверждение.
Username:
Password:
Subject:
No HTML allowed in subject
Message:



Notice! This user has turned on the option that logs IP addresses of anonymous posters.