АБВГДЕЖЗИЙКЛМНОПРСТУФЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфцчшщъыьэюя
В кодовом наборе КОИ-8 порядок перечисления букв отличен от алфавитного. При этом сначала перечислены строчные буквы, потом заглавные:
Юабцдефгхийклмнопярстужвьызшэщчъюабцдефгхийклмнопярстужвьызшэщъ
Формальную схему перекодировки задает комбинаторная подстановка порядковых номеров букв (без учета их регистра) в кодовых наборах ср1251 и КОИ-8, которая номеру каждой буквы в исходной кодировке ставит в соответствие ее номер в результирующей кодировке. В программной реализации эта подстановка задается одномерным массивом sub номеров букв в результирующей кодировке, которые индексированы по порядку их номеров в исходной кодировке. В зависимости от направления перекодировки подстановку номеров букв можно записать следующим образом, используя синтаксис языков программирования C и BASH:
КОИ8−> cp 1251: cp 1251 = sub [КОИ8]
cp 1251−>КОИ-8: КОИ8=${ sub [ cp 1251]}
В любом случае таблицу перекодировки tab образует конкатенация 2-х дубликатов массива sub номеров букв, где значения элементов увеличены на 0340 и 0300 для преобразования номеров букв результирующей кодировки в их коды, которые индексируются порядковыми номерами этих букв в исходной кодировке уже с учетом регистра букв. Учитывая, что номер заглавной или строчной буквы в любой исходной кодировке равен ее коду минус 0300, такой формат таблицы перекодировки tab обеспечивает преобразование кодов букв, независимо от направления перекодировки и регистра букв.
|
|
Редактирование программы перекодировки ср1251 в КОИ-8
В графическом окне текстового редактора xedit с кириллическим шрифтом ср1251 подготовить исходный текст программы на командном языке BASH для перекодировки файлов из кодового набора ср1251 в кодовый набор КОИ-8. Исходный текст этой программы с обязательными комментариями на русском языке необходимо сохранить в файле rnn.sh (где литеры nn обозначают номер варианта задания).
#!/bin/bash
# Программа перекодировки текста ср1251 в КОИ-8
function winkoi # Функция построения таблицы перекодировки
{
# Подстановка номеров букв koi8 (в системе 8) koi8=${num[cp1251]}
num=( 01 02 27 07 04 05 26 32 11 12 13 14 15 16 17 20 \
22 23 24 25 06 10 03 36 33 35 37 31 30 34 00 21 )
# Конкатенация кодов для строчных и заглавных букв в koi8
for i in ${num[*]} ; do # перечисление номеров букв
low=$low"\3$i" # склеить lower koi octal code set
up=$up"\3`expr $i + 40`" # склеить upper koi octal code set
done
echo $up$low # total koi octal code set
return # возврат из функции winkoi
} # function winkoi
# Диагностика аргументов командной строки
if test $# -lt 2 # Контроль числа аргументов
then echo "Usage: `basename $0` input.win output.koi" ; exit −7
fi
if ! test -f $1 # Проверка существования входного файла
then echo "$1: No such regular file" >&2 ; exit 2 # ENOENT
|
|
fi
if ! test -r $1 # Контроль доступа по чтению для входного файла
then echo "$1: Permission denied to read" >&2 ; exit 13 # EACCES
fi
# Контроль маршрутного имени для выходного файла
curdir=`pwd` # маршрутное имя текущего каталога (if basename only)
outdir=`expr $2 : '\(.*/\)' \| $curdir` # маршрутное имя каталога
if [ ! -w $outdir -a ! -e $2 ] # контроль каталога по (пере)записи
then echo "$outdir: Permission denied to write" >&2 ; exit -13
fi
if test -d $2 # Проверка, что выходной файл не каталог
then echo "$2: Is directory" >&2 ; exit 21 # EISDIR
fi
if [ -e $2 -a ! -w $2 ] # Контроль перезаписи выходного файла
then echo $2: Permission denied to rewrite ; exit 13 # EACCES
fi
# Транслитерация кодов cp1251 в koi8
cat $1 | tr "\300-\337\340-\377" `winkoi` > $2
exit 0 # Нормальное завершение программы
Выполнение и контроль перекодировки ср1251 в КОИ-8
Для интерпретации программы rnn.sh командным процессором BASH нужно ввести, следующую командную строку в графическом окне эмулятора терминала xterm:
$ bash rnn.sh rnn.sh rnn.koi
Результатом выполнения этой команды будет создание или перезапись файла rnn.koi, который содержит исходный текст программы на языке BASH с комментариями в кодировке КОИ-8. Результат этой перекодировки следует проверить визуально в графическом окне текстового редактора xedit с кириллическим шрифтом КОИ-8.
|
|
Переменные языка shell, массивы переменных
В отличие от других языков программирования, в языке shell переменные не разделяются на типы (то есть не типизированы). Все переменные представляют собой литералы, то есть обыкновенные строки, которым присвоено имя. Это означает, что если значение переменной "85" – оно интерпретируется не как число, а как строка, состоящая из двух символов "8" и "5". Shell допускает целочисленную арифметику с переменными, но лишь в ограниченном числе команд. Физически переменные представляют собой участки памяти, в которую занесены коды символов в одной из кодировок.
Принято выделять три типа переменных:
· позиционные параметры;
· специальные параметры;
· именованные переменные.
Значения позиционных параметров устанавливаются из аргументов, указанных в командной строке при запуске программы. Для них зарезервированы имена в виде цифр. Значения позиционных параметров в программе можно получить используя ссылки на них при помощи символа $: $1, $2, … . Всего в командной строке могут быть указано не более 128 параметров, но ссылаться через ссылки можно лишь на 9 первых. Для работы с большим числом параметром используется команда shift, которая смещает указатель с первого параметра на заданное число позиций.
|
|
На ряду с позиционными параметрами, интерпретатор shell при запуске сценария автоматически инициализирует следующие специальные параметры:
? | – значение, возвращаемое последней командой; |
$ | – номер процесса; |
! | – номер фонового процесса; |
# | – число позиционных параметров, переданных программе; |
* | – перечень позиционных параметров, представленных как одна строка; |
@ | – перечень позиционных параметров, представленных как последовательность слов; |
- | – флаги, передаваемые в shell; |
Для получения значений, записанных в специальные параметры, перед ними необходимо поставить символ $. Так чтобы использовать в команде значение, соответствующее числу аргументов, с которыми программа была вызвана, следует указывать $#.
Отличием специальных переменных * и @ состоит в том, что первая переменная будет представлена как одна строка
“arg1 arg2 arg3 …”,
а вторая как набор строк
“arg1” “arg2” “arg3” … .
Именованные переменные – переменные созданные и инициализированные пользователем. Один из наиболее простых способов создания и присваивания именованной переменной значения имеет вид:
Var_name=value
Здесь Var_name – имя переменной, value – присвоенное ей значение. Пробелы перед и после знака = недопустимы.
Для получения значения переменной, перед ее именем необходимо указать знак $. При попытке обратиться к неопределенной переменной интерпретатор не будет выдавать сообщение об ошибке. Значением любой неопреденной переменной является пустая строка.
Названия переменных в языке shell могут состоять из букв, символов подчеркивания и цифр и не должны совпадать с именами команд языка shell. Первая буква имени может быть буквой или символом подчеркивания.
В сценариях языка Shell нет понятия области видимости переменной. Любая переменная доступна в любой части кода (то есть является аналогом глобальной переменной языка Си, например). Даже если переменная была определена внутри некоторой функции, она будет определена и доступна и вне этой функции.
В строгом варианте при обращении к переменным через ссылки их имена должны быть взяты в фигурные скобки ${Var_name}. Такую запись рекомендуется использовать тогда, когда имя переменной имеет сложную структуру и может возникнуть синтаксическая ошибка.
В таблице 1.2 представлены различные способы присваивания переменным значений.
Таблица 1.2
Дата добавления: 2019-11-16; просмотров: 233; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!