В комментариях предложили более элегантное решение этой задачки.
#!/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. С кириллицей этот способ не сработает, используйте предыдущий
По вкусу можно добавить проверки, как в предыдущем скрипте.
Pingback: BASH: Получить номер буквы в латинском алфавите, решение «в лоб». | Персональный блог Толика Панкова
Pingback: Преобразование имени раздела и устройства в формат SYSLINUX | Персональный блог Толика Панкова