Вопрос был задан студенту-первокурснику преподом на зачете по 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
.
Есть и более элегантное решение.
Pingback: BASH: Получить номер буквы в латинском алфавите, более элегантное решение. | Персональный блог Толика Панкова
Pingback: BASH: Получить номер буквы в латинском алфавите, решение «в лоб». | Персональный блог Толика Панкова