Основы программирования в Linux
Шрифт:
update_cd {
if [ -z "$cdcatnum" ]; then
echo "You must select a CD first"
find_cd n
fi
if [ -n "$cdcatnum" ]; then
echo "Current tracks are :-"
list_tracks
echo
echo "This will re-enter the tracks for $cdtitle"
get_confirm && {
grep -v "^${cdcatnum}, " $tracks_file > $temp_file
mv $temp_file $tracks_file
echo
add_record_tracks
}
fi
return
}
9. Функция
count_cds
count_cds {
set $(wc -l $title_file)
num_titles=$1
set $(wc -l $tracks_file)
num_tracks=$1
echo found $num_titles CDs, with a total of $num_tracks tracks
get_return
return
}
10. Функция
remove_records
удаляет элементы из файлов базы данных с помощью команды grep -v
, удаляющей все совпадающие строки. Учтите, что нужно применять временный файл. Если вы попытаетесь применить команду:
grep -v "^$cdcatnum" > $title_file
файл
$title_file
станет пустым благодаря перенаправлению вывода >
до того, как команда grep
выполнится, поэтому она будет читать уже пустой файл.
remove_records {
if [ -z "$cdcatnum" ]; then
echo You must select a CD first find_cd n
fi
if [ -n "$cdcatnum" ]; then
echo "You are about to delete $cdtitle"
get_confirm && {
grep -v "^${cdcatnum}, " $title_file > $temp_file
mv $temp_file $title_file
grep -v "^${cdcatnum}, " $tracks_file > $temp_file
mv $temp_file $tracks_file
cdcatnum=""
echo Entry removed
}
get_return
fi
return
}
11. Функция
list_tracks
снова использует команду grep
для извлечения нужных вам строк, команду cut
для доступа к отдельным полям и затем команду more
для постраничного вывода. Если вы посмотрите, сколько строк на языке С займет повторная реализация этих 20 необычных строк кода, то поймете, каким мощным средством может быть командная оболочка.
list_tracks {
if [ "$cdcatnum" = "" ]; then
echo no CD selected yet
return
else
grep "^${cdcatnum}, " $tracks_file > $temp_file
num_tracks=${wc -l $temp_file}
if [ "$num_tracks" = "0" ]; then
echo no tracks found for $cdtitle
else
{
echo
echo "$cdtitle :-"
echo
cut -f 2- -d , $temp_file
echo
} | ${PAGER:-more}
fi
fi
get_return
return
}
12. Теперь,
когда все функции определены, можно вводить основную процедуру. Первые несколько строк просто приводят файлы в известное состояние; затем вы вызываете функцию формирования менюset_menu_choice
и действуете в соответствии с ее выводом. Если выбран вариант
quit
(завершение), вы удаляете временный файл, выводите сообщение и завершаете сценарий с успешным кодом завершения.
rm -f $temp_file
if [ !
– f $title_file ]; then
– f $title_file ]; then
touch $title_file
fi
if [ !
– f $tracks_file ]; then
– f $tracks_file ]; then
touch $tracks_file
fi
# Теперь непосредственно приложение
clear
echo
echo
echo "Mini CD manager" sleep 1
quit=n
while [ "$quit" != "y" ]; do
set_menu_choice
case "$menu_choice" in
a) add_records;;
r) remove records;;
f) find_cd y;;
u) update_cd;;
c) count_cds;;
l) list_tracks;;
b)
echo
more $title_file
echo
get return;;
q | Q ) quit=y;;
*) echo "Sorry, choice not recognized";;
esac
done
# Убираем и покидаем
rm -f $temp_file echo "Finished"
exit 0
Замечания, касающиеся приложения
Команда trap в начале сценария предназначена для перехвата нажатия пользователем комбинации клавиш <Ctrt>+<C>. Им может быть сигнал
EXIT
или INT
, в зависимости от настроек терминала. Существуют другие способы реализации выбора пункта меню, особенно конструкция
select
в оболочках bash и ksh (которая, тем не менее, не определена в стандарте X/Open). Она представляет собой специализированный селектор пунктов меню. Проверьте ее на практике, если ваш сценарий может позволить себе быть немного менее переносимым. Для передачи пользователям многострочной информации можно также воспользоваться встроенными документами.
Поделиться с друзьями: