АБВГДЕЖЗИЙКЛМНОПРСТУФЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфцчшщъыьэюя



 

В кодовом наборе КОИ-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; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!