Министерство образования Российской Федерации.
Московский государственный институт электроники и математики
(технический университет)
Кафедра Кибернетики
Лабораторная работа № 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.
Выполнение работы: вар 2
c-41-26$ cat > prog04.sh
#!/bin/sh
echo "Ukazhite direktoriu"
read m
cd $m
echo "Stroki Slova Simvoli Imya Fail"
wc *|awk ' {if(($4!="total")&&($1!="0")) {print($0)}}'
c-41-26$ sh prog04.sh
Ukazhite direktoriu
/home/student/c-41/c-41-26
Stroki Slova Simvoli Imya Fail
4 16 115 bd.txt
4 7 53 bd1.txt
6 19 147 prog04.sh
3 15 91 prog2.c
3 13 103 prog4.sh
23 46 224 prog44.sh
Вар 1
c-41-26$ cat > prog4.sh
#!/bin/sh
echo " Строки Слова Символы Имя фаила"
wc *|awk '{if (($4!="total")&&($1!="0")) {print$0}}'
c-41-26$ cat prog4.sh
#!/bin/sh
echo " Строки Слова Символы Имя фаила"
wc *|awk '{if (($4!="total")&&($1!="0")) {print$0}}'
c-41-26$ sh prog4.sh
Строки Слова Символы Имя фаила
4 16 115 bd.txt
4 7 53 bd1.txt
3 15 91 prog2.c
3 13 103 prog4.sh
Вар 6
#!/bin/sh
cd ./
for i in *
do
if [ -d $i ]
then
echo $i "-folder,"
else
echo $i "-file,"
fi
if [ -r $i ]
then
echo " readable,"
else
echo " non-readable,"
fi
if [ -w $i ]
then
echo "writable."
else
echo " non-writable."
fi
done
