Случай в магазине

Как у поэта Лесина о природе зла/добра.

Стою в магазине я, в очереди на кассу, пробиваю себе вкусный бич-пакет Биг-Бон, нравятся они мне очень.
По передо мной стоит «сердобольная» тетушка, из серии тех проклятых «сердоболов», которые будут поудобнее укладывать человека с переломом основания черепа до приезда скорой, вызывать скорую мирно отдыхающему пьянице, или рассказывать про вред ГМО и прививок, ежили их, наконец, догнало мракобесие в терминальной стадии.

— Вот зачем вы эту гадость покупаете, в этих бич-пакетах одна химия! Купите лучше макарон простых!
— Женщина, милая, вот вы приходите домой, включаете свет. Так вот, в лампочке — физика! Если у вас телефон с компьютером есть — в них математика и ее подруга информатика, а у вас самой внутри — биология. Если дома есть кот, то сразу две биологии в одной квартире! Знаете, жить вообще страшно, куда ни плюнь, везде какая-нибудь наука…

Один из немногих моментов, когда я узрел подтверждение гипотезы, что человек, однако, своего рода компьютер. Я увидел BSOD в реальности. А у кассирши, явный перегруз модуля «корпоративной вежливости».

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

Вот еще одно решение задачи про номер буквы в латинском алфавите (это подойдет и для русского, нужно просто изменить паттерн). Решение не очень красивое, зато дико простое.

#!/bin/bash
alf="abcdefghijklmnopqrstuvwxyz" #переменная, хранящая паттерн
b=`expr index $alf $1`
echo "$1 is $b"

Чтоб нумерация начиналась с 0, меняем строку
b=`expr index $alf $1`
на
b=`expr index $alf $1 - 1`

Примечание: параметр index команды expr позволяет получить индекс строковой последовательности: index <где_найти> <что_найти>

Готовый скрипт с проверками

На PasteBin
На GitHub

Остальные варианты решения той же задачи.

1. С помощью операторов for и if Копия
2. С помощью printf Копия

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

Котопанк Шредингера.

Можно сказать, что номерследующий N-ART за 2019 г.

Джва года ждал этой картинки. Нарисовано вручную, и так, скорее всего, пойдет без изменений на новую футболку #2. Разве что текст добавлю.

Остальные файлы здесь

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

Преамбула

Вопрос был задан студенту-первокурснику преподом на зачете по Linux. Студент на вопрос не ответил и вчера ушел на пересдачу, впрочем, задав вопрос мне. Думаю, формулировка задания понятна. Я, кстати, сначала тоже запарился, и начал выдумывать всякие дикие варианты с получением кода символа, преобразованием кода символа в номер буквы латинского алфавита, потом подумал, что иметь секс с локалью (разбирайся еще, юникод не юникод) не стоит, и родил вот такое простое решение с помощью цикла for и оператора if.

Решение

Нужную букву будем брать из параметра командной строки скрипта.

#!/bin/bash

#get number of latin letter in alphabet
#use nlett <letter>, e.g nlett a

SNUM=1

for SYMB in {a..z}; do
    if [[ "$SYMB" == "$1" ]]; then
	break
    else
	let "SNUM=SNUM+1"
    fi
done

echo "$1 is $SNUM"

Перебираем в цикле все буквы от a до z, нашли нужную — выводим номер, не нашли — увеличиваем счетчик $SNUM.
Чтобы отсчет шел с 0, просто присваиваем начальному значению счетчика 0:
SNUM=0

Дополнительная проверка

Чтобы пользователь не ввел ничего лишнего, а только маленькую латинскую букву, можно добавить проверку перед циклом for:

SFND=`echo $1|grep '^[a-z]$'`
if [ -z "$SFND" ]; then
    echo "Error: in first parameter must be one small latin letter!"
    exit 1
fi

И заменить в цикле и далее $1 на $SFND.

Скрипт целиком

На PasteBin
На GitHub

Есть и более элегантное решение.