Консультация № 186056
16.05.2012, 15:22
109.37 руб.
0 7 1
Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос:Помогите пожалуйста написать shell-процедуру под Unix.Код прокомментировать.
Условие: Написать shell-процедуру, которая выполняет действия:
читает содержимое файла, имя которого вводится при исполнении процедуры;
создает новый файл, имя которого передается в качестве параметра;
выводит на экран каждые 6 секунд очередные две строки файла в обратном порядке;
сортирует выведенные на экран строки по длине и записывает их в новый файл;
при вводе с клавиатуры трижды слова end удаляет второй файл и завершает работу.

Обсуждение

Неизвестный
16.05.2012, 21:10
общий
выводит на экран каждые 6 секунд очередные две строки файла в обратном порядке
В обратном порядке это:
1) сначала 2я строка, а затем 1я?
2) символы в строке переставлены в обратном порядке?
Неизвестный
16.05.2012, 22:33
общий
Символы переставлены в обратном порядке
Неизвестный
17.05.2012, 00:26
общий
это ответ
Здравствуйте, ШмонинЕА!
Код:
#!/bin/bash

# Информация об использовании
usage()
{
echo "Usage: $( basename "$0" ) <outfile>"
exit 1
}

# Должен быть 1 параметр
if [[ $# -ne 1 ]] ; then
usage
fi

# Имя выходного файла
outfile="$1"

# Запрос на ввод имени файла
while true ; do
read -p "Имя файла с исходными данными:" infile
[[ -r "$infile" ]] && break
echo "Файл должен существовать и быть доступным для чтения"
done

# Читает файл и выводит строки согласно условия
readproc()
{
# Читает строку и выводит ее в реверсном порядке
getline()
{
local str rc
# Читаем
read -r str ; rc=$?
# Реверс
str=$( echo "$str" | rev )
# Вывод строки на экран
# Вывод на stdout и stderr
[[ $rc -eq 0 ]] && echo "$str" 1>&2 || echo -n "$str" 1>&2
[[ $rc -eq 0 ]] && echo "${#str} $str" || echo -n "${#str} $str"
return $rc
}
# Читаем 2 строки
while getline && getline ; do
# Если нет параметров то спим
[[ $# -eq 0 ]] && sleep 6
done < "$infile" | sort -n | cut -d ' ' -f2- >"$outfile"
}

# Обработка выхода
exitproc()
{
# Удалить файл
[[ -f "$outfile" ]] && rm "$outfile" >/dev/null
# Завершить группу процессов
kill -9 -$$ >/dev/null
wait
}

# Ловим сигналы
trap exitproc INT TERM QUIT EXIT HUP ABRT

# Сколько раз ввести 'end'
endcount=3

echo "$endcountр. раз ввести 'end' для завершения"

# Запуск фоновых процессов
readproc &

# Читаем ввод пользователя
while read ; do
# Если quit то завершить цикл
if [[ "$REPLY". == "end". ]] ; then
! [[ $(( --endcount )) -gt 0 ]] && break
echo "$endcountр. ввести 'end' для завершения"
fi
done

exitproc

Для тестового файла:
Код:
@linux:~/Projects/186056> cat test
333.
2222.
11111.
5.
4444.

Вывод программы:
Код:
@linux:~/Projects/186056> ./186056 out
Имя файла с исходными данными:test
3р. раз ввести 'end' для завершения
.333
.2222
.11111
.5
.4444
end
2р. ввести 'end' для завершения
end
1р. ввести 'end' для завершения
end
Убито

Полученный файл out:
Код:

.5
.333
.2222
.4444
.11111
5
Неизвестный
17.05.2012, 11:32
общий
Исправил ошибку в ответе
Неизвестный
18.05.2012, 15:36
общий
А вот получается наш файл out удаляется после 3-х раз ввода end?
Неизвестный
18.05.2012, 16:13
общий
18.05.2012, 16:19
По условию:
при вводе с клавиатуры трижды слова end удаляет второй файл и завершает работу

Файл удаляется при завершении программы в процедуре exitproc.
Неизвестный
19.05.2012, 15:34
общий
Cпасибо большое за помошь!
Форма ответа