Основы программирования в Linux
Часть 41 из 324 Информация о книге
5. Далее идут две очень короткие функции,
иinsert_title, для пополнения файлов базы данных. Несмотря на то, что некоторые программисты ненавидят однострочные функции вроде этих, они помогают сделать понятнее другие функции.insert_trackЗа ними следует более длинная функция
, использующая эти функции. В данной функции применяется проверка на соответствие шаблону, чтобы исключить ввод запятых (поскольку мы. используем запятые для разделения полей), и арифметические операции для увеличения номера текущей дорожки на 1, когда вводятся данные о новой дорожке.add_record_trackinsert_title() {echo $* >> $title_filereturn}insert_track() {echo $* >> $tracks_filereturn}add_record_tracks() {echo "Enter track information for this CD"echo "When no more tracks enter q"cdtrack=1cdttitle=""while [ "$cdttitle" != "q" ]doecho -e "Track $cdtrack, track title? \c"read tmpcdttitle=${tmp%%, *}if [ "$tmp" != "$cdttitle" ]; thenecho "Sorry, no commas allowed"continuefiif [ -n "$cdttitle" ] ; thenif [ "$cdttitle" ! = "q" ]; theninsert_track $cdcatnum, $cdtrack, $cdttitlefielsecdtrack=$((cdtrack-1))ficdtrack=$((cdtrack+1))done}6. Функция
позволяет вводить основную информацию о новом компакт-диске.add_recordsadd_records() {# Подсказка для начала ввода информацииecho -е "Enter catalog name \с"read tmpcdcatnum=${tmp%%, *}echo -e "Enter title \c"read tmpcdtitle=${tmp%%, *}echo -e "Enter type \c"read tmpcdtype=${tmp%%, *}echo -e "Enter artist/composer \c"read tmpcdac=${tmp%%, *}# Проверяет, хочет ли пользователь ввести информациюecho About to add new entryecho "$cdcatnum $cdtitle $cdtype $cdac"# Если получено подтверждение, добавляет данные в конец файла.# с заголовкамиif get_confirm ; theninsert_title $cdcatnum, $cdtitle, $cdtype, $cdacadd_record_trackselseremove_recordsfireturn}7. Функция
с помощью командыfind_cdищет текст с названием компакт-диска в файле с заголовочной информацией. Вам нужно знать, сколько раз была найдена строка, а команда grep только вернет значение, указывающее на то, что строка не была найдена или была найдена многократно. Для решения этой проблемы сохраните вывод в файл, отводящий по одной строке на каждое найденное совпадение, а затем сосчитайте количество строк в файле.grepУ команды счетчика слов,
, в выводе есть пробельный символ, разделяющий количества строк, слов и символов в файле. Используйте синтаксическую записьwcдля извлечения первого параметра в выводе и переноса его в переменную$(wc -l $temp_file). Если бы вам был нужен другой следующий далее параметр, нужно было бы воспользоваться командойlinesfoundдля установки значений переменных-параметров оболочки из вывода команды.setИзменив значение переменной
(Internal Field Separator, внутренний разделитель полей) на запятую, вы сможете разделить поля, разграниченные запятыми. Альтернативный вариант — применить командуIFS.cutfind_сd() {if [ "$1" = "n" ]; thenasklist=nelseasklist=yficdcatnum=""echo -e "Enter a string to search for in the CD titles \c"read searchstrif [ "$searchstr" = "" ]; thenreturn 0figrep "$searchstr" $title_file > $temp_fileset $(wc -l $temp_file)linesfound=$1case "$linesfound" in0)echo "Sorry, nothing found"get_return