Забродин УНИХ основы командного интерфейса 2010
.pdfTEMP2=`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