Толик Панков
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

Толик Панков [userpic]
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

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

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

Tags: ,
Comments


alf=abcdefghijklmnopqrstuvwxyz

b=`expr index $alf $1`

echo "$1 is $b"

Это тоже решение в лоб, препод не зачтет. Но в принципе короткое и хорошее, достойно упоминания.