Литмир - Электронная Библиотека
Содержание  
A
A

Два файла объединены общим полем

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=&quot;&quot;

current cd=&quot;&quot;

title_file=&quot;title.cdb&quot;

tracks_file=&quot;tracks.cdb&quot;

temp_file=/tmp/cdb.$$

trap 'rm -f $temp_file' EXIT

3. Определите ваши функции так, чтобы сценарий, выполняясь с первой строки, мог найти все определения функций до того, как вы попытаетесь вызвать любую из них в первый раз. Для того чтобы не повторять один и тот же программный код в нескольких местах, сначала вставьте две функции, служащие простыми утилитами:

get_return() (

 echo -е &quot;Press return \с&quot;

 read x

 return 0

}

get_confirm() (

 echo -e &quot;Are you sure? \c&quot;

 while true do

  read x

  case &quot;$x&quot; in

   y | yes | Y | Yes | YES )

    return 0;;

   n | no | N | No | NO )

    echo

    echo &quot;Cancelled&quot;

    return 1;;

   *)

    echo &quot;Please enter yes or no&quot; ;;

  esac

 done

}

4. Теперь вы дошли до основной, формирующей меню функции

set_menu_choice
. Содержимое меню изменяется динамически, добавляя дополнительные пункты при выборе компакт-диска.

set_menu_choice() {

 clear

 echo &quot;Options :-&quot;

 echo

 echo &quot; a) Add new CD&quot;

 echo &quot; f) Find CD&quot;

 echo &quot; c) Count the CDs and tracks in the catalog&quot;

 if [ &quot;$cdcatnum&quot; != &quot;&quot; ]; then

  echo &quot; 1) List tracks on $cdtitle&quot;

  echo &quot; r) Remove $cdtitle&quot;

  echo &quot; u) Update track information for $cdtitle&quot;

 fi

 echo &quot; q) Quit&quot; echo

 echo -e &quot;Please enter choice then press return \c&quot;

 read menu_choice

 return

}

Примечание

Имейте в виду, что команда

echo -е
не переносится в некоторые командные оболочки.

40
{"b":"285844","o":1}