Основы программирования в Linux
Два файла объединены общим полем
(Каталог). Следует помнить о том, что обычно на одну строку файла с заголовочной информацией приходится много строк в файле с данными о дорожках.CatalogПоследнее, что мы должны решить, — способ разделения элементов данных. Поля фиксированной ширины, обычные в реляционных базах, — не всегда самый удобный вариант. Другой распространенный способ, применяемый в данном примере, — запятая (т. е. файл со значениями, разделенными запятыми, или CSV-файл).
В упражнении 2.23 только для того, чтобы вы окончательно не запутались, применяются следующие функции:
□
;get_return()□
;get_confirm()□
;set_menu_choice()□
;insert_title()□
;insert_track()□
;add_record_tracks()□
;add_records()□
;find_cd()□
;update_cd()□
;count_cds()□
;remove_records()□
.list_tracks()Упражнение 2.23. Приложение для работы с коллекцией компакт-дисков1. Сначала в примере сценария как всегда стоит строка, обеспечивающая его выполнение как сценария командной оболочки, за которой следует некоторая информация об авторских правах:
#!/bin/bash# Очень простой пример сценария командной оболочки для управления# коллекцией компакт-дисков.# Copyright (С) 1996-2007 Wiley Publishing Inc.# Это свободно распространяемое программное обеспечение;# вы можете распространять эту программу и/или изменять ее# в соответствии с положениями GNU General Public License,# документа, опубликованного фондом Free Software Foundation;# либо версии 2 этой лицензии или (по вашему выбору)# любой более свежей версии.# Эта программа распространяется в надежде на ее полезность,# но WITHOUT ANY WARRANTY, (без каких-либо гарантий);# даже без предполагаемой гарантии MERCHANTABILITY# or FITNESS FOR A PARTICULAR PURPOSE (годности# ее для продажи или применения для определенной цели).# Более подробную информацию см. в GNU General Public License.# Вы должны были получить копию GNU General Public License# вместе с этой программой;# если нет, пишите в организацию Free Software Foundation,# Inc. no адресу: 675 Mass Ave, Cambridge, MA 02139, USA.2. Теперь убедитесь, что установлены некоторые глобальные переменные, которые будут использоваться во всем сценарии. Задайте заголовочный файл, файл с данными о дорожках и временный файл и перехватите нажатие комбинации клавиш <Ctrl>+<C> для того, чтобы удалить временный файл, если пользователь прервет выполнение сценария.
menu_choice=""current cd=""title_file="title.cdb"tracks_file="tracks.cdb"temp_file=/tmp/cdb.$$trap 'rm -f $temp_file' EXIT3. Определите ваши функции так, чтобы сценарий, выполняясь с первой строки, мог найти все определения функций до того, как вы попытаетесь вызвать любую из них в первый раз. Для того чтобы не повторять один и тот же программный код в нескольких местах, сначала вставьте две функции, служащие простыми утилитами:
get_return() (echo -е "Press return \с"read xreturn 0}get_confirm() (echo -e "Are you sure? \c"while true doread xcase "$x" iny | yes | Y | Yes | YES )return 0;;n | no | N | No | NO )echoecho "Cancelled"return 1;;*)echo "Please enter yes or no" ;;esacdone}4. Теперь вы дошли до основной, формирующей меню функции
. Содержимое меню изменяется динамически, добавляя дополнительные пункты при выборе компакт-диска.set_menu_choiceset_menu_choice() {clearecho "Options :-"echoecho " a) Add new CD"echo " f) Find CD"echo " c) Count the CDs and tracks in the catalog"if [ "$cdcatnum" != "" ]; thenecho " 1) List tracks on $cdtitle"echo " r) Remove $cdtitle"echo " u) Update track information for $cdtitle"fiecho " q) Quit" echoecho -e "Please enter choice then press return \c"read menu_choicereturn}ПримечаниеИмейте в виду, что команда
не переносится в некоторые командные оболочки.echo -е