Библиотека сайта rus-linux.net
Руководство по Bash для начинающих | ||
---|---|---|
Назад | Глава 8: Пишем интерактивные скрипты | Вперед |
Отображение пользовательских сообщений
Интерактивный или не интерактивный?
Некоторые скрипты работают вообще без какого-либо взаимодействия с пользователем. К числу преимуществ неинтерактивных скриптов относятся следующие:
- скрипт каждый раз запускается предсказуемым образом;
- скрипт может работать в фоновом режиме.
Однако, для многих скриптов требуются данные, вводимые пользователем, либо скрипт в процессе работы может выдавать сообщения пользователю. Преимуществом интерактивных скриптов, кроме всего прочего, являются:
- возможность создавать более гибкие скрипты;
- возможность пользователям настраивать скрипт так, чтобы в различных случаях он работал по-разному;
- возможность в процессе работы скрипта получать от него сообщения.
При написании интерактивных скриптов никогда не следует воздерживаться от комментариев. Сценарий, который выводит соответствующие сообщения, более удобен для пользователя и, возможно, более прост в отладке. Скрипт может идеально делать свою работу, но вы получите массу звонков в службу поддержки, если скрипт не сообщает пользователю, что он делает. Поэтому добавляйте сообщения, которые просят пользователя подождать результата, пока идут вычисления. Если есть возможность, попробуйте сообщить, как долго пользователь будет ожидать. Если при выполнении определенного задания, время ожидания должно быть довольно продолжительным, вы, возможно, захотите добавить к данным, выдаваемым вашим скриптом, какой-нибудь индикатор хода процесса.
Когда пользователю выдается приглашение ввести данные, то также лучше дать лишнюю информацию о вводимых данных, чем ее окажется мало. Это также относится к случаю проверки аргументов и сообщению об их использовании.
В Bash есть команды echo и printf, позволяющие выдавать пользователям комментарии, и, хотя вы должны к настоящему моменту быть знакомы, по крайней мере, с использованием команды echo, мы в следующих разделах обсудим некоторые примеры ее использования.
Использование встроенной команды echo
Встроенная команда echo выдает в выходной поток свои аргументы, разделенные пробелами, и завершает вывод символом новой строки. Возвращаемый код возврата всегда равен нулю. В команде echo есть два параметра:
-e:
интерпретируются символы, перед которыми указан обратный слеш;-n:
подавляется выдача символа новой строки.
В качестве примера добавим комментарии в скрипты feed.sh
и penguin.sh
из раздела "Проверка аргументов командной строки" и сделаем их немного лучше:
michel ~/test> cat penguin.sh #!/bin/bash # This script lets you present different menus to Tux. He will only be happy # when given a fish. To make it more fun, we added a couple more animals. if [ "$menu" == "fish" ]; then if [ "$animal" == "penguin" ]; then echo -e "Hmmmmmm fish... Tux happy!\n" elif [ "$animal" == "dolphin" ]; then echo -e "\a\a\aPweetpeettreetppeterdepweet!\a\a\a\n" else echo -e "*prrrrrrrt*\n" fi else if [ "$animal" == "penguin" ]; then echo -e "Tux don't like that. Tux wants fish!\n" exit 1 elif [ "$animal" == "dolphin" ]; then echo -e "\a\a\a\a\a\aPweepwishpeeterdepweet!\a\a\a" exit 2 else echo -e "Will you read this sign?! Don't feed the "$animal"s!\n" exit 3 fi fi michel ~/test> cat feed.sh #!/bin/bash # This script acts upon the exit status given by penguin.sh if [ "$#" != "2" ]; then echo -e "Usage of the feed script:\t$0 food-on-menu animal-name\n" exit 1 else export menu="$1" export animal="$2" echo -e "Feeding $menu to $animal...\n" feed="/nethome/anny/testdir/penguin.sh" $feed $menu $animal result="$?" echo -e "Done feeding.\n" case "$result" in 1) echo -e "Guard: \"You'd better give'm a fish, less they get violent...\"\n" ;; 2) echo -e "Guard: \"No wonder they flee our planet...\"\n" ;; 3) echo -e "Guard: \"Buy the food that the Zoo provides at the entry, you ***\"\n" echo -e "Guard: \"You want to poison them, do you?\"\n" ;; *) echo -e "Guard: \"Don't forget the guide!\"\n" ;; esac fi echo "Leaving..." echo -e "\a\a\aThanks for visiting the Zoo, hope to see you again soon!\n" michel ~/test> feed.sh apple camel Feeding apple to camel... Will you read this sign?! Don't feed the camels! Done feeding. Guard: "Buy the food that the Zoo provides at the entry, you ***" Guard: "You want to poison them, do you?" Leaving... Thanks for visiting the Zoo, hope to see you again soon! michel ~/test> feed.sh apple Usage of the feed script: ./feed.sh food-on-menu animal-name
Подробнее о специальных символах можно узнать в разделе "Отмена свойств специальных символов". В следующей таблице приводятся последовательности специальных символов, используемых в команде echo:
Таблица 8.1. Последовательности специальных символов, используемые в команде
Последовательность | Значение |
\a | Предупреждение (звуковой сигнал). |
\b | Возврат к предыдущему символу (Backspace). |
\c | Подавление выдачи оставшейся части строки. |
\e | Символ Escape. |
\f | Подача носителя (Form feed) |
\n | Новая строка. |
\r | Возврат каретки. |
\t | Горизонтальная табуляция. |
\v | Вертикальная табуляция. |
\\ | Обратный слеш. |
\0NNN | Восьмибитовый символ, значение которого равно восьмеричному значению NNN (от нуля до трех восьмеричных цифр). |
\NNN | Восьмибитовый символ, значение которого равно восьмеричному значению NNN (от одной до трех восьмеричных цифр). |
\xHH | Восьмибитовый символ, значение которого равно шестнадцатеричному значению (одна или две шестнадцатеричные цифры). |
Дополнительную информацию о команде printf и о том, как с ее помощью можно отформатировать выходные данные, смотрите в документации по Bash. Имейте в виду, что в различных версиях Bash могут быть отличия.
Предыдущий раздел: | Оглавление | Следующий раздел: |
Подводим итоги главы 7 | Получение данных, вводимых пользователем |