Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Забродин УНИХ основы командного интерфейса 2010

.pdf
Скачиваний:
159
Добавлен:
16.08.2013
Размер:
1.33 Mб
Скачать

TEMP2=`wc –l $2 | cut -f1 -d “ “`

#Выбор файла с меньшим числом строк if test $TEMP1 –lt $TEMP2

then

#Вывод на экран содержимого файла $1 more $1

#Выход из процедуры exit 000

fi

if test $TEMP2 -lt $TEMP1 test

#Вывод на экран содержимого файла $2 more $2

#Выход из процедуры exit 000

fi

#Проверка равенства числа строк в файлах $1 и $2 if test $TEMP1 –eq $TEMP2

test

#Вывод на экран содержимого файлов $1 и $2 more $1 $2

#Выход из процедуры exit 111

fi

#Конец процедуры Proc6.1

Пример выполнения процедуры proc6.1: $cat f1

111111111111111111111

22222222222222222222

33333333333333333333

44444444444444444444 $cat f2

11111111111111111111

22222222222222222222 $proc6.1 f1 f2

111111111111111111111111111

222222222222222222222222222

$

131

2. Написать процедуру, которая находит во всех подкаталогах заданного первым параметром каталога обыкновенные файлы с односимвольными именами и изменяет имена найденных файлов на соответствующие двухсимвольные, например имя f заменяется на ff и т. д. Если найден хотя бы один такой файл, то процедура возвращает код завершения 0, в противном случае — 1. Код завершения вывести на экран.

Решение:

#proc6.2

#Поиск во всех подкаталогах файлов с односимвольными именами

find –f -name ? $1

#Замена односимвольного имени на двухсимвольное

-exec mv {} {}{} \;

#Сохранение кода завершения в переменной TEMP TEMP=$?

# Вывод на экран кода завершения echo $TEMP

#Выход из процедуры exit $TEMP

#Конец процедуры proc6.2

Пример выполнения процедуры proc6.2: $ls ~/new

f ggg l s

$ls ~/new/new1 a bbb c dd $proc6.2 ~/new 0

$ls ~/new ff ggg ll ss

$ls ~/new/new1 aa bbb cc dd

3. Написать процедуру, которая:

для всех файлов текущего каталога, содержащих заданную первым параметром подстроку, выводит на экран общее число таких строк в найденных файлах;

132

для всех файлов текущего каталога, содержащих заданную вторым параметром подстроку, выводит на экран общее число символов в найденных строках;

для всех файлов текущего каталога, содержащих заданную третьим параметром подстроку, выводит на экран общее число слов в найденных строках.

Вывести на экран сообщение о максимальном числе строк в указанных категориях.

Решение:

#proc6.3

#Поиск строк, содержащих заданную подстроку $1 if grep -d skip -h $1 * > file1

then

#Подсчет общего числа найденных строк

TEMP1=`wc -l file1 | cut -f1 -d" "` echo $TEMP1

rm file1 else

TEMP1=0 echo $TEMP1

fi

#Поиск строк, содержащих заданную подстроку $2 if grep -d skip -h $2 * > file2

then

#Подсчет общего числа символов в найденных строках

TEMP22=`wc -c file2 | cut -f1 -d" "` TEMP2=`wc -l file2 | cut -f1 -d" "` echo $TEMP22

rm file2 else

TEMP22=0 echo $TEMP22

fi

#Поиск строк, содержащих заданную подстроку $3 if grep -d skip -h $3 * > file3

then

#Подсчет общего числа слов в найденных строках

TEMP33=`wc -w file3 | cut -f1 -d" "`

133

TEMP3=`wc -l file3 | cut -f1 -d" "` echo $TEMP33

rm file3 else

TEMP33=0 echo $TEMP33

fi

#Нахождение максимального числа строк

if test $TEMP1 -ge $TEMP2 -a $TEMP1 -ge $TEMP3 then

echo $1 $TEMP1

fi

if test $TEMP2 -ge $TEMP3 -a $TEMP2 -ge $TEMP1 then

echo $2 $TEMP2

fi

if test $TEMP3 -ge $TEMP1 -a $TEMP3 -ge $TEMP2 then

echo $3 $TEMP3

fi

#Конец процедуры Proc6.3

Пример выполнения процедуры proc6.3: $cat f1

123 456 789

123 456 789 $cat f2

456 123 789

789 789 789 $cat f3

456 456 456

456 456 456

456 456 456 $proc6.3 567 123 456

0

36

18

456 6

$

134

10.7.ЦИКЛЫ В ПРОЦЕДУРАХ

1.Написать процедуру, которая:

среди пользователей, работающих в данный момент времени в системе, находит всех пользователей, имена которых содержатся во вводимой в процедуру символьной строке;

выводит на экран найденные имена пользователей.

Решение:

#proc7.1

#формирование в файле file списка работающих пользователей who >file

#Ввод заданных имен пользователей echo “input string:”

read temp

#Присваивание позиционным параметрам заданных в строке имен пользователей

set $temp

#Поиск в файле file заданных имен и вывод их на экран

while [ “$1” ] do

# Поиск в файле file очередного имени grep $1 file

shift done

# Конец процедуры proc7.1

Пример выполнения процедуры proc7.1: $who

user2

tty2

2007-03-12 15:52

user3

tty3

2007-03-12 16:18

user1

:0

2007-03-12 10:43 (console)

user1

pts/0

2007-03-12 10:43

user1

pts/1

2007-03-12 10:50

$proc7.1

 

“input string:”

 

user2 user3

 

user2

tty2

2007-03-12 15:52

user3

tty3

2007-03-12 16:18

$

 

 

 

 

135

2. Написать процедуру, которая:

выполняет над вводимыми при работе процедуры целыми положительными числами указанное первым параметром действие; выводит на экран при вводе очередного числа результат

выполнения указанного действия; заканчивает работу при вводе вместо очередного числа слова

stop”.

Решение:

#proc7.2 (вариант 1)

#Инициализация переменной result для сложения и вычитания if [ $1 –eq “+” ] o [$1 –eq “-” ] then

result=0 fi

#Инициализация переменной result для умножения и деления if [ $1 –eq “\*” ] o [ $1 –eq “\/” ] then

result=1 else exit

fi

#Сохранение в переменной action кода заданного действия action=$1

#Считывание очередного операнда

read TEMP

#Присвоение первому параметру процедуры очередного операнда

set $TEMP

#Цикл выполнения заданного действия

while true do

#Проверка конца ввода операндов if [ “$1” = “stop” ] then

exit

fi

#Исключение деления на «0»

if [ $action =”/” ] a [ $1 –eq 0 ] then exit

fi

# Выполнение заданного действия над очередным операндом result=`expr $result $action $1`

shift

136

done

#Вывод на экран результата echo “result=$result”

#Конец процедуры Proc7.2

#proc7.2 (вариант 2)

#Ввод первого операнда echo input first number read result

#Сохранение операции action=$1

while true do

#Ввод второго и последующих операндов echo input next number or "stop"

read TEMP set $TEMP

if [ "$1" = "stop" ] then

exit

fi

#Проверка деления на «0»

if [ $action = "\/" -a $1 = 0 ] then

exit

fi

echo action $action

#Выполнение очередной операции и вывод #результата if [ $action = "\*" ]

then

result=`expr $result \* $1`

fi

if [ $action = "\/" ] then

result=`expr $result \/ $1`

fi

if [ $action = "-" ] then

result=`expr $result - $1`

137

fi

if [ $action = "+" ] then

result=`expr $result + $1`

fi

echo "result=$result" shift

done

#Конец процедуры 7.2

Пример выполнения процедуры proc7.2 (вариант 2): $proc7.3 "\*"

input first number 25

input next number or stop 2

action \* result=50

input next number or stop 3

action \* result=150

input next number or stop stop

$

3.Написать процедуру, которая:

определяет высоту поддерева каталогов, начиная от каталога, передаваемого в качестве первого параметра;

выводит на экран полные маршрутные имена всех подкаталогов, являющихся последними в полном маршрутном имени максимальной длины.

Решение:

#proc7.3

#Нахождение относительных маршрутных имен каталогов и сохранение их в файле

find $1 -depth >file C1=`pwd`

138

H=0

for i in `cat file` do

if [ -d $C1/$i ] then

cd $C1/$i h=0 C2=$C1/$i

#Определение высоты поддерева каталогов while [ $C2 != $C1/$1 ]

do

cd .. C2=`pwd`

h=`expr $h + 1` done

if [ $H -lt $h ] then

H=$h

fi fi done

echo subtree height is $H

#Нахождение и вывод на экран полных маршрутных имен каталогов

cd $C1

for i in `cat file` do

if [ -d $C1/$i ] then

cd $C1/$i h=0 C2=$C1/$i

while [ $C2 != $C1/$1 ] do

cd .. C2=`pwd`

h=`expr $h + 1` done

if [ $H -eq $h ]

139

then

echo "full routing name" echo $C1/$i

fi

fi done cd $C1

# Конец процедуры Proc7.3

Пример выполнения процедуры proc7.3: $ pwd

/home/user1

$ mkdir catalog1 $cd catalog1

$ mkdir catalog11 catalog12 $ cd catalog11

$ mkdir catalog111 catalog112 $ cd ../..

$ proc7.4 catalog1 subtree height is 2 full routing name

/home/user1/catalog1/catalog11/catalog111 full routing name /home/user1/catalog1/catalog11/catalog112

$

10.8.ПРОЦЕДУРЫ С ИСПОЛЬЗОВАНИЕМ ТАЙМЕРА

1.Написать процедуру, которая выполняет следующие действия: читает содержимое первого файла, передаваемого в качестве

первого параметра; читает содержимое второго файла, передаваемого в качестве

второго параметра; если число строк в первом и втором файлах — различное, то

выводит на экран каждые 10 с попеременно, начиная с первой, строки из первого и второго файлов, а затем – все оставшиеся строки большего из файлов;

140