Нейл Мэтью - Основы программирования в Linux
- Название:Основы программирования в Linux
- Автор:
- Жанр:
- Издательство:«БХВ-Петербург»
- Год:2009
- Город:Санкт-Петербург
- ISBN:978-5-9775-0289-4
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Нейл Мэтью - Основы программирования в Linux краткое содержание
В четвертом издании популярного руководства даны основы программирования в операционной системе Linux. Рассмотрены: использование библиотек C/C++ и стандартных средств разработки, организация системных вызовов, файловый ввод/вывод, взаимодействие процессов, программирование средствами командной оболочки, создание графических пользовательских интерфейсов с помощью инструментальных средств GTK+ или Qt, применение сокетов и др. Описана компиляция программ, их компоновка c библиотеками и работа с терминальным вводом/выводом. Даны приемы написания приложений в средах GNOME® и KDE®, хранения данных с использованием СУБД MySQL® и отладки программ. Книга хорошо структурирована, что делает обучение легким и быстрым.
Для начинающих Linux-программистов
Основы программирования в Linux - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Применяя конструкцию case
с метасимволами в образцах, такими как *
, будьте особенно внимательны. Проблема заключается в том, что принимается во внимание первое найденное соответствие образцу, несмотря на то, что в последующих ветвях могут быть образцы с более точным соответствием.
Вы можете написать новую версию сценария проверки пользовательского ввода с помощью конструкции case
, сделав сценарий немного более избирательным и терпимым к неожиданным вариантам ввода.
#!/bin/sh
echo "Is it morning? Please answer yes or no "
read timeofday
case "$timeofday" in
yes) echo "Good Morning";;
no ) echo "Good Afternoon";;
y ) echo "Good Morning";;
n ) echo "Good Afternoon";;
* ) echo "Sorry, answer not recognized";;
esac
exit 0
Как это работает
Когда выполняется оператор case
, он берет содержимое переменной timeofday
и сравнивает его поочередно с каждой строкой-образцом. Как только строка совпадает с введенной информацией, оператор case
выполняет код, следующий за )
, и завершается.
Оператор case
выполняет обычную подстановку в строках, которые он использует для сравнения. Следовательно, вы можете задать часть строки с последующим метасимволом *
. Применение единственного символа *
будет соответствовать совпадению с любой введенной строкой, поэтому поместите этот вариант после всех остальных образцов строк для того, чтобы задать некоторое стандартное поведение оператора case
, если не будут найдены совпадения с другими строками-образцами. Это возможно, потому что оператор case
сравнивает с каждой строкой-образцом поочередно. Он не ищет наилучшее соответствие, а всего лишь первое встретившееся. Условие, принятое по умолчанию, часто оказывается невыполнимым, поэтому применение метасимвола *
может помочь в отладке сценариев.
Предыдущая версия конструкции case, безусловно, элегантнее варианта с множественными операторами if
, но, объединив все образцы, можно создать более красивую версию.
#!/bin/sh
echo "Is it morning? Please answer yes or no "
read timeofday
case "$timeofday" in
yes | y | Yes | YES ) echo "Good Morning";;
n* | N*) echo "Good Afternoon";;
* ) echo "Sorry, answer not recognized";;
esac
exit 0
Как это работает
Данный сценарий в операторе case
использует несколько строк-образцов в каждой ветви, таким образом, case
проверяет несколько разных строк для каждого возможного оператора. Этот прием делает сценарий короче и, как показывает практика, облегчает его чтение. Приведенный программный код также показывает, как можно использовать метасимвол *
, несмотря на то, что он может соответствовать непредусмотренным образцам. Например, если пользователь введет строку never
, она будет соответствовать образцу n*
, и на экран будет выведено приветствие Good Afternoon (Добрый день), хотя такое поведение в сценарии не предусматривалось. Учтите также, что заключенный в кавычки знак подстановки *
не действует.
В заключение, для того чтобы сделать сценарий многократно используемым, вам необходимо использовать другое значение кода завершения в том случае, когда применяется образец по умолчанию для непонятного варианта ввода.
#!/bin/sh
echo "Is it -morning? Please answer yes or no"
read timeofday
case "$timeofday" in
yes | y | Yes | YES )
echo "Good Morning"
echo "Up bright and early this morning"
;;
[nN]*)
echo "Good Afternoon"
;;
*)
echo "Sorry, answer not recognized"
echo "Please answer yes or no"
exit 1
;;
esac
exit 0
Как это работает
Для демонстрации другого способа определения соответствия образцу в этом программном коде изменен вариант определения соответствия для ветви no
. Также видно, как в каждой ветви оператора case может выполняться несколько операторов. Следует быть внимательным и располагать в операторе самые точные образцы строк первыми, а самые общие варианты образцов последними. Это очень важно, потому что оператор case
выполняется, как только найдено первое, а не наилучшее соответствие. Если вы поставите ветвь *)
первой, совпадение с этим образцом будет определяться всегда, независимо от варианта введенной строки.
Учтите, что сдвоенная точка с запятой ;;
перед служебным словом esac
необязательна. В отличие от программирования на языке С, в котором пропуск маркера завершения считается плохим стилем программирования, пропуск ;;
не создает проблем, если последняя ветвь оператора case
— это вариант, принятый по умолчанию, поскольку другие образцы уже не будут анализироваться.
Для того чтобы сделать средства установления соответствия образцам более мощными, можно применять следующие строки-образцы:
[yY] | [Yy][Ее][Ss])
В них ограничен набор разрешенных букв, но при этом допускаются разнообразные ответы и предлагается более строгий контроль, чем при применении метасимвола *
.
Иногда может понадобиться сформировать последовательность команд. Например, вы хотите выполнить оператор, только если удовлетворяется несколько условий.
if [ -f this_file ]; then
if [ -f that_file ]; then
if [ -f the_other_file ]; then
echo "All files present, and correct"
fi
fi
fi
Или вы хотите, чтобы хотя бы одно условие из последовательности условий было истинным.
if [ -f this_file ]; then
foo="True"
elif [ -f that_file ]; then
foo="True"
elif [ -f the_other_file ];
then foo="True"
else
foo="False"
fi
if ["$foo" = "True" ]; then
echo "One of the files exists"
fi
Несмотря на то, что это можно реализовать с помощью нескольких операторов if
, как видите, результаты получаются очень громоздкими. В командной оболочке есть пара специальных конструкций для работы со списками команд: И-список (AND list) и ИЛИ-список (OR list). Обе они часто применяются вместе, но мы рассмотрим синтаксическую запись каждой из них отдельно.
Эта конструкция позволяет выполнять последовательность команд, причем каждая последующая выполняется только при успешном завершении предыдущей. Синтаксическая запись такова:
оператор1 && оператор2 && оператор3 &&...
Интервал:
Закладка: