Файл: Лабораторная работа 3. Командный интерпретатор shell.docx
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 12.12.2023
Просмотров: 201
Скачиваний: 3
cat p31.2. Группировка команд.Средства группировки:; и <перевод строки> определяют последовательное выполнение команд;& асинхронное (фоновое) выполнение предшествующей команды;&& выполнение последующей команды при условии нормального завершенияпредыдущей, иначе игнорировать;|| выполнение последующей команды при ненормальном завершении предыдущей,иначе игнорировать.Для группировки команд также могут использоваться фигурные "{}" и круглые "()" скобки. Рассмотрим примеры, сочетающие различные способы группировки: Если введена командная строкаk1 && k2; k3где k1, k2 и k3 - какие-то команды, то "k2" будет выполнена только при успешном завершении "k1"; после любого из исходов обработки "k2" (т.е. "k2" будет выполнена, либо пропущена) будет выполнена "k3".k1 && {k2; k3}Здесь обе команды ("k2" и "k3") будут выполнены только при успешном завершении "k1".{k1; k2} &В фоновом режиме будет выполняться последовательность команд "k1" и "k2".1.3. SHELL-переменныеИмя shell-переменной - это начинающаяся с буквы последовательность букв, цифр и подчеркиваний. Значение shell-переменной - строка символов. Для присваивания значений переменным может использоваться оператор присваивания "=".var_1=13 - "13" - это не число, а строка из двух цифр.var_2="ОС UNIX" - здесь двойные кавычки (" ") необходимы, так как в строке есть пробел. При обращении к shell-переменной необходимо перед именем ставить символ "$". Так командыecho $var_2echo var_2выдадут на экранОС UNIXvar_21.4. ПараметрыВ командный файл могут быть переданы параметры. В shell используются позиционные параметры (т.е. существенна очередность их следования). В командном файле соответствующие параметрам переменные (аналогично shell-переменным) начинаются с символа "$", а далее следует одна из цифр от 0 до 9: При обращении к параметрам перед цифрой ставится символ доллара "$" (как и при обращении к переменным): $0 соответствует имени данного командного файла; $1 первый по порядку параметр; $2 второй параметр и т.д. Пусть командный файл с именем "examp-1" имеет содержимое:echo Это расчет $0:sort $2 >> $1cat $1а файлы "cock" и "tail" содержат соответственноcock:Это отсортированный файл:tail:132Тогда после вызова командыexamp-1 cock tailна экране будетЭто расчет examp-1:Это отсортированный файл:123
Сам интерпретатор shell автоматически присваивает значения следующим переменным (параметрам):
? значение, возвращенное последней командой;
$ номер процесса;
! номер фонового процесса;
# число позиционных параметров, передаваемых в shell;
* перечень параметров, как одна строка;
@ перечень параметров, как совокупность слов;
- флаги, передаваемые в shell.
При обращении к этим переменным (т.е при использовании их в командном файле - shell-программе) следует впереди ставить "$".
Различия $* и $@ состоит в том, что первая переменная может быть представлена как
"par1 par2 par3"
а вторая как
"par1" "par2" "par3"
1.5. Операторы циклов
1.5.2. Условный оператор "if"
В общем случае оператор "if" имеет структуру
if условие
then список
[elif условие
then список]
[else список]
fi
Здесь "elif" сокращенный вариант от "else if" может быть использован наряду с полным, т.е. допускается вложение произвольного числа операторов "if" (как и других операторов). Конструкции
[elif условие
then список]
и
[else список]
не являются обязательными (в данном случае для указания на необязательность конструкций использованы квадратные скобки - не путать с квадратными скобками команды "test"!). Самая усеченная структура этого оператора
if условие
then список
fi
если выполнено условие (как правило это ком получен код завершения "0", то выполняется "список", иначе он пропускается. Обратите внимание, что структура обязательно завершается служебным словом "fi". Число "fi", естественно, всегда должно соответствовать числу "if".
Примеры.
Пусть написан расчет "if-1"
if [ $1 -gt $2 ]
then pwd
else echo $0 : Hello!
fi
Тогда вызов расчета
if-1 12 11
даст
/home/shal/STUDY/SHELL
а
if-1 12 13
даст
if-1 : Hello!
Возможно использовать в условии то свойство shell, что команды могут выдавать различный код завершения.
Пусть расчет "if-2" будет
if a=`expr "$1" : "$2"`
then echo then a=$a code=$?
else echo else a=$a code=$?
fi
тогда вызов " $if-2 by by " даст then a=2 code=0
а
" $if-2 by be " даст else a=0 code=1
Еще пример на вложенность
###
# if-3: Оценка достижений
echo -n " А какую оценку получил на экзамене?: "
read z
if [ $z = 5 ]
then echo Молодец !
elif [ $z = 4 ]
then echo Все равно молодец !
elif [ $z = 3 ]
then echo Все равно !
elif [ $z = 2 ]
then echo Все !
else echo !
fi
Можно обратить внимание на то, что желательно использовать сдвиги при записи программ, чтобы лучше выделить вложенность структур.
1.5.3. Оператор вызова ("case")Оператор выбора "case" имеет структуру:case строка inшаблон) список команд;;шаблон) список команд;;...esacЗдесь "case" "in" и "esac" - служебные слова. "Строка" (это может быть и один символ) сравнивается с "шаблоном". Затем выполняется "список команд" выбранной строки.Примеры.#### case-1: Структура "case".# Уже рассматривавшийся в связи со# структурой "if" пример проще и# нагляднее можно реализовать с# помощью структуры "case".echo -n " А какую оценку получил на экзамене?: "read zcase $z in5) echo Молодец ! ;;4) echo Все равно молодец ! ;;3) echo Все равно ! ;;2) echo Все ! ;;*) echo ! ;;esacОбязательно ставить в конце строк выбора ";;"Обычно последняя строка выбора имеет шаблон "*", что в структуре "case" означает "любое значение". Эта строка выбирается, если не произошло совпадение значения переменной (здесь $z) ни с одним из ранее записанных шаблонов, ограниченных скобкой ")". Значения просматриваются в порядке записи.#### case-2: Справочник.# Для различных фирм по имени выдается# название холдинга, в который она входитcase $1 inONE|TWO|THREE) echo Холдинг: ZERO ;;MMM|WWW) echo Холдинг: Not-Net ;;Hi|Hello|Howdoing) echo Холдинг: Привет! ;;*) echo Нет такой фирмы ;;esacПри вызове "case-2 Hello" на экран будет выведено:Холдинг: Привет!А при вызове "case-2 HELLO" на экран будет выведено:Нет такой фирмыМожно эту структуру использовать для реализации простейших меню.#### case-3: Реализация меню с помощью команды "case"echo "Назовите файл, а затем (через пробел)наберите цифру, соответствующую требуемойобработке:1 - отсортировать2 - выдать на экран3 - определить число строк "read x y # x - имя файла, y - что сделатьcase $y in1) sort < $x ;;2) cat < $x ;;3) wc -l < $x ;;*) echo "Мы не знаемтакой команды ! " ;;esacНапишем команду "case-4", которая добавляет информацию к файлу, указанного первым параметром (если параметр один), со стандартного входа, либо (если 2 параметра) из файла, указанного в качестве первого параметра:#### case-4: Добавление в файл.# Использование стандартной переменной.# "$#" - число параметров при вводе расчета# ">>" - перенаправление с добавлением в файлcase $# in1) cat >> $1 ;;2) cat >> $2 < $1 ;;*) echo "Формат: case-4 [откуда] куда" ;;esac"$1" (при "$#=1") - это имя файла, в который происходит добавление со стандартного входа.
"$1" и "$2" (при $#=2) - это имена файлов , из которого ("$1") и в который ("$2") добавлять.Во всех других случаях (*) выдается сообщение о том, каким должен быть правильный формат команды.5.4. Оператор цикла с перечислением ("for")Оператор цикла "for" имеет структуру:for имя [in список значений]doсписок командdoneгде "for" - служебное слово определяющее тип цикла, "do" и "done" - служебные слова, выделяющие тело цикла. Фрагмент "in список значений" может отсутствовать.Пусть команда "lsort" представлена командным файломfor i in f1 f2 f3doproc-sort $idoneВ этом примере имя "i" играет роль параметра цикла. Это имя можно рассматривать как shell-переменную, которой последовательно присваиваются перечисленные значения (i=f1, i=f2, i=f3), и выполняется в цикле команда "proc-sort".Часто используется форма "for i in *", означающая "для всех файлов текущего каталога".Пусть "proc-sort" в свою очередь представляется командным файломcat $1 | sort > ${1}_sortedт.е. последовательно сортируются указанные файлы, результаты сортировки направляются в файлы f1_sorted f2_sorted и f3_sortedМожно сделать более универсальной команду "lsort", если не фиксировать перечень файлов в команде, а передавать произвольное их число параметрами.Тогда головная программа будет следующей:for idoproc-sort $idoneЗдесь отсутствие после "i" служебного слова "in" с перечислением имен говорит о том , что список поступает через параметры команды. Результат предыдущего примера можно получить, набравlsort f1 f2 f3Усложним ранее рассматривавшуюся задачу (под именем "case-2") определения холдинга фирмы. Теперь можно при вызове указывать произвольное количество фирм. При отсутствии в структуре оператора "for" фрагмента "in список значений", значения берутся из параметров вызывающей команды.# holding: Справочник.# Для различных фирм по имени выдается# название холдинга, в который она входитfor idocase $i inONE|TWO|THREE) echo Холдинг: ZERO ;;MMM|WWW) echo Холдинг: Not-Net ;;Hi|Hello|Howdoing) echo Холдинг: Привет! ;;*) echo Нет такой фирмы ;;esacdoneПри вызове "holding Hello HELLO ONE" на экране будет:Холдинг: Привет!Нет такой фирмыХолдинг: Not-NetЕще пример.# subdir: Выдает имена всех поддиректориев# директория с именем $dirfor i in $dir/*doif [ -d $i ]then echo $ifidoneОтметим различие в специальных переменных "$*" и "$@", представляющих перечень параметров. Первый представляет параметры, как строку, а второй, как совокупность слов.