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

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

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

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

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *