Наши партнеры








Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

На главную -> MyLDP -> Электронные книги по ОС Linux
Руководство по 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   Получение данных, вводимых пользователем