#!/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
Убито
.5
.333
.2222
.4444
.11111
Если Вы уже зарегистрированы на Портале - войдите в систему, если Вы еще не регистрировались - пройдите простую процедуру регистрации.