МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ ИНСТИТУТ ЭЛЕКТРОНИКИ И МАТЕМАТИКИ
(ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ)
Кафедра кибернетики
Лабораторная работа №4
по дисциплине
«Операционные системы»
на тему: «Командные файлы»
Выполнил студент группы С-41
Лукинов Н.А.
Проверил
Гостев И.М.
Москва 2010
Файл начала сеанса (login - файл)
Независимо от версии Shell при входе в систему UNIX ищет
файл начала сеанса с предопределенным именем, чтобы выпол-
нить его как командный файл;
- для UNIX версии 7 это: .profile;
- для C-Shell это: .login и/или .cshrc.
В этот файл обычно помещают команды:
- установки характеристик терминала;
- оповещения типа who, date;
- установки каталогов поиска команд (обычно: /bin, /usr/bin);
- смена подсказки с $ на другой символ и т.д.
Процедура языка Shell
Это командный файл. Два способа его вызова на выполнение:
1. $ sh dothat (где dothat - некоторый командный файл);
2. $ chmod 755 dothat (сделать его выполнимым, т.е.
-rwxr-xr-x)
$ dothat.
Следует знать порядок поиска каталогов команд (по умолча-
нию):
- текущий;
- системный /bin;
- системный /usr/bin.
Следовательно, если имя вашего командного файла дублирует
имя команды в системных каталогах, последняя станет недос-
тупной (если только не набирать ее полного имени).
Переменные Shell
В языке Shell версии 7 определение переменной содержит
имя и значение: var = value.
Доступ к переменной - по имени со знаком $ спереди:
fruit = apple (определение);
echo $fruit (доступ);
apple (результат echo).
Таким образом, переменная - это строка. Возможна конкате-
кация строк:
$ fruit = apple
$ fruit = pine$fruit
$ echo $fruit
pineapple
$ fruite = apple
$ wine = ${fruite}jack
$ echo $wine
applejack
$
Другие способы установки значения переменной - ввод из
файла или вывод из команды (см. раздел 7.6), а также присва-
ивание значений переменной - параметру цикла for из списка
значений, заданного явно или по умолчанию (см. раздел 7.9).
Переменная может быть:
1) Частью полного имени файла: $d/filename, где $d - пе-
ременная (например, d = /usr/bin).
2) Частью команды:
$ S = "sort + 2n + 1 - 2" (наличие пробелов требует кавы-
чек "")
$ $S tennis/lpr
$ $S basketball/lpr
$ $S pingpong/lpr
$
Однако внутри значения для команды не могут быть символы
|, >, <, & (обозначающие канал, перенаправления и фоновый
режим).
Условный оператор if
Используем имена переменных, представляющие значения па-
раметров процедуры:
sort +1 -2 $1 | tr ... | lpr
Пример неверного вызова:
makelist (без параметров), где $1 неопределен.
Исправить ошибку можно, проверяя количество аргументов -
значение переменной $# посредством if - оператора.
Пример: (измененной процедуры makelist):
if test $# -eq 0
then echo "You must give a filename"
exit 1
else sort +1 -2 $1 | tr ... | lpr
fi
Здесь test и exit - команды проверки (см. раздел 7.11) и
выхода.
Таким образом, синтаксис оператора if:
if <если эта команда выполняется успешно, то>;
then <выполнить все следующие команды до else или, если
его нет, до fi>;
[else <иначе выполнить следующие команды до fi>]
Ключевые слова if, then, else и fi пишутся с начала строки.
Успешное выполнение процедуры означает, что она возвраща-
ет значение true = 0 (zero) (неуспех - возвращаемое значение
не равно 0).
Оператор exit 1 задает возвращаемое значение 1 для неу-
дачного выполнения makelist и завершает процедуру.
Возможны вложенные if. Для else if есть сокращение elif,
которое одновременно сокращает fi.
1. Основной командный файл
c-41-15$ cat > lab4.sh (Создание основного командного файла)
#!/bin/sh
cd /home/student/c-41/c-41-15/lab1/ (Переход в директорию с первым локальным командным файлом)
sh lab41.sh (Запуск первого локального командного файла)
cd /home/student/c-41/c-41-15/ (Переход в директорию с вторым локальным командным файлом)
sh lab42.sh (Запуск второго локального командного файла)
2. Первый локальный файл
c-41-15$ cat > lab41.sh (Создание первого локального командного файла)
#!/bin/sh
echo "Директория"
pwd (Вывод директории в которой находиться файл)
echo " Строки Слова Символы Имя файла"
wc *|awk '{if (($4!="total")&&($1!="0")) {print $0}}'
(Фильтр команды wc, для вывода информации только о файлах, с проверкой столбца строк, а также общего количества)
3. Второй локальный файл
c-41-15$ cat > lab42.sh (Создание второго локального командного файла)
#!/bin/sh
echo "Директория"
pwd (Вывод директории в которой находиться файл)
echo " Строки Слова Символы Имя файла"
wc *|awk '{if (($4!="total")&&($1!="0")) {print $0}}'
(Фильтр команды wc, для вывода информации только о файлах, с проверкой столбца строк, а также общего количества)
4. Запуск основного командного файла
c-41-15$ sh lab4.sh
Директория
/home/student/c-41/c-41-15/lab1 (Вывод директории в котором
Он находится)
Строки Слова Символы Имя файла
6 17 128 lab41.sh
4 98 4710 prog4
6 10 58 prog4.c
Директория
/home/student/c-41/c-41-15
Строки Слова Символы Имя файла
5 21 149 bd.txt
3 15 108 ed.hup
7 9 103 lab4.sh
6 17 128 lab42.sh
3 9 78 new.sh
1 1 10 new2.sh
5 22 162 pr.sh
7 10 73 prog.c
4 103 4742 prog2
6 13 87 prog2.c
4 98 4718 prog3
6 10 63 prog3.c
4 111 4746 prog4
6 11 90 prog4.c
6 10 88 prog5.c
7 13 76 summ.sh
3 3 22 term.sh
