Linux и UNIX: программирование в shell. Руководство разработчика
Linux и UNIX: программирование в shell. Руководство разработчика читать книгу онлайн
Данная книга является практическим руководством по программированию интерпретатора Bourne shell -cтандартного командного интерпретатора в UNIX, полностью совместимого с интерпретатором BASH shell в Linux. Книга предназначена для начинающих и опытных программистов и содержит множество полезных примеров, советов и подсказок. С ее помощью читатель сможет быстро научиться создавать shell–сценарии для реальных задач и ситуаций, возникающих в большинстве систем UNIX и Linux.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
$ pg caseterm
#!/bin/sh
# caseterm
echo " choices are.. vt100, vtl02, vt220"
echo -n "enter your terminal type :"
read TERMINAL
case $TERMINAL in
vtl00|vt102) TERM=vt100
;;
vt220) TERM=vt220
;;
*) echo "`basename $0`: Unknown response" >&2
;;
echo "setting it to vt100 anyway, so there"
TERM=vt100
esac
export TERM
echo "Your terminal ls set to $TERM"
Если при выполнении сценария указывается некорректный тип терминала, получим следующее:
$ caseterm
choices are.. vt100, vtl02, vt220 enter your terminal type :vt900
caseterm: Unknown response setting it to vt100 anyway, so there
Your terminal ls set to vt100
Если вводится существующий тип терминала, получим:
$ case2
choices are.. vt100, vtl02, vt220 enter your terminal type :vt220
Your terminal ls set to vt220
В любом случае пользователь устанавливает тип терминала.
18.4.3. Приглашение для ввода y или n
Оператор case удобно применять при отображении запроса на продолжение обработки. Ниже приводится сценарий, в котором пользователю предлагается указать в качестве ответа либо 'у', что означает продолжение обработки, либо 'n' — выход из сценария. Если пользователь введет у, Y, yes или Yes, обработка будет продолжена в соответствии с частью сценария после оператора case. Если пользователь введет n, N, no или какой‑либо другой ответ, работа со сценарием для него завершается.
$ pg caseans
#!/bin/sh
# caseans
echo -n "Do you wish to proceed [y..n] :"
read ANS
case $ANS in
y|Y|yes|Yes) echo "yes is selected"
;;
n|N) echo "no is selected"
exit 0 # нет ошибки, поэтому для выхода укажите 0
;;
*) echo "`basename S0`" : Unknown response" >&2
exit 1
;;
esac
# если мы оказались здесь, были выбраны значения y|Y|yes|Yes.
Если при выполнении указанного сценария выбрать некорректный вариант ответа, отображаются следующие данные:
$ caseans
Dо you wish to proceed [y..n] :df
caseans : Unknown response
В случае корректного ответа:.
$ caseans
Dо you wish to proceed [y..n] :y
yes is selected
18.4.4. Оператор case и передача командных параметров
Можно также использовать оператор case при передаче параметров в сценарии.
В следующем сценарии при осуществлении проверки используется специальный параметр $#, который представляет число передаваемых аргументов. Если это число отлично от 1, сценарий завершает работу, отображая соответствующее сообщение.
Затем оператор case выполняет прием следующих параметров: passwd, start, stop или help. В дальнейшем код реализуется для каждого совпадения с этими шаблонами. При передаче неизвестного значения на экран выводится стандартное сообщение об ошибке.
$ pg caseparam
#!/bin/sh
# caseparam
if [ $# != 1 ]; then
echo "Usage:`basename $0` [start | stop | help] >&2
exit 1
fi;
# присвойте переменной ОРТ параметр
OPT=$1
case $OPT in
start) echo "starting… `basename $0`"
# здесь коды для начала процесса
;;
stop) echo "stopping..`basenarae $0`"
# здесь колы для прекращения процесса
;;
help)
# здесь находится код для отображения справочной страницы
;;
*) echo "Usage: `basename $0` [start | stop | help]"
;;
esac
Если сценарию передается неверный параметр, получим следующее:
$ caseparam what
Usage:caseparam [start|stop | help]
В случае передачи действительного параметра:
$ caseparam stop
stopping..caseparam
18.4.5. Прием потока ввода без применения шаблонных команд
После шаблонной части необязательно указывать команды; если после шаблонной части команды отсутствуют, до перехода к дальнейшей обработке выполняется фильтрация нежелательных откликов.
Если в отдел учета следует направить отчет об учетной записи, сначала желательно удостовериться, что пользователь правильно ввел номер отдела, а затем уже уточнить, какой отчет выполняется. Такой подход реализуется при сравнении с шаблоном всех требуемых значений; любые другие методы неприемлемы.
В следующем сценарии указано, что если пользователь вводит номер отдела, который не совпадает со значением 234, 453, 655 или 454, то пользователь выйдет из сценария. Если номер отдела указан правильно, аналогичный подход применяется при определении типа отчета. По окончании выполнения оператора case остаются действительный номер отдела и правильный тип отчета. Ниже приводится соответствующий сценарий.
$ pg casevalid
#!/bin/sh
# casevalid
TYPE=""
echo -n "enter the account dept No: :"
read ACC
case $ACC in
234);;
453);;
655);;
454) ;;
*) echo "`basename $0`: Unknown dept No:" >&2
echo "try..234,453,655,454" exit, 1
esac
# если оказались здесь, получен верный номер отдела
echo " 1. post"
echo " 2. prior"
echo -n "enter the type of report: "
read ACC_TYPE
case $ACC_TYPE in
l)TYPE=post;;
2}TYPE=prior;;
*) echo "`basename $0`: Unknown account type." >&2
exit 1
;;
esac
# если оказались здесь, значит все указано правильно!
echo "now running report for dept $ACC for the type $TYPE"
# выполняем отчет о команде.
Если вводимые данные достоверны, получим:
$ casevalid
enter the account dept No: :234
1. . post
2. . prior
enter the type of report:2
now running report for dept 234 for the type prior
Если номер отдела введен неверно, получим:
$ casevalid
enter the account dept No: :432
casevalid: Unknown dept No: try..234,453,655,454
При вводе неправильного типа отчета, получим:
$ casevalid
enter the account dept No: :655
1. . post
2. . prior
enter the type of report:4
casevalid: Unknown account type.
18.4.6. Значения переменных, заданные по умолчанию
Если при просмотре значения переменной пользователь нажимает клавишу [Return], сценарий завершает работу не всегда. С помощью проверки определяется, установлена ли данная переменная, и если не установлена, то ей может быть присвоено значение.
В следующем сценарии для выполнения отчета пользователю предлагают ввести название дня недели. Если пользователь нажимает клавишу [Return], используется день недели, заданный по умолчанию, а именно "Saturday". Это название и присваивается переменной when.
Если пользователь вводит название другого дня, с помощью оператора case выполняется проверка, совпадает ли введенное название с названием одного из дней недели, предназначенных для выполнения сценария, а именно "Saturday", "Sunday"
и "Monday". Обратите внимание, что всевозможные аббревиатуры названий дней недели составлены так, чтобы выполнялся перехват "всех возможных" комбинаций этих названий.
Ниже приводится соответствующий сценарий.
$ pg caserep
#!/bin/sh
# caserep
echo " Weekly Report"
echo -n "What day do you want to run report [Saturday] :"
#если нажать клавишу ввода, принимается заданное по умолчанию название Saturday
read WHEN
echo "validating..
${WHEN:="Saturday"}"