Перейти к содержанию

14.2 Создание простого сценария (Creating a Simple Script)

Как уже упоминалось, сценарии оболочки могут варьироваться от крайне простых до крайне сложных. Рассмотренный ранее пример был очень простым сценарием: он выводил текст на экран и выполнял одну команду. Для сдачи экзамена Linux+/LPIC-1 вам необходимо уметь создавать более сложные сценарии. Поэтому в данной части главы мы рассмотрим следующие темы:

  • Вывод текста на экран
  • Добавление команд в сценарий
  • Чтение ввода от пользователя

Начнём с обсуждения вывода текста на экран в сценарии оболочки.


Вывод текста на экран (Displaying Text on the Screen)

Эта задача решается довольно просто. Как вы уже видели в рассмотренных ранее примерах, вывести текст на экран в сценарии оболочки можно с помощью команды echo. Синтаксис её использования прост: достаточно написать echo "выводимый_текст" в файле сценария.

В простом примере сценария, который мы рассматривали ранее, строка echo "The current date and time is:" использовалась для вывода соответствующего текста на экран. Поскольку сценарий оболочки просто вызывает и запускает команду echo, вы можете использовать все параметры, которые применяли бы при вызове echo из приглашения командной строки. Обратитесь к man-странице команды echo, чтобы узнать о доступных возможностях.

Помимо вывода текста на экран, из сценария можно также запускать команды. Рассмотрим, как это делается.


Добавление команд в сценарий (Adding Commands to a Script)

Чтобы запустить команду оболочки изнутри сценария, достаточно написать нужную команду со всеми требуемыми параметрами в теле сценария. В простом примере, рассмотренном ранее, команда date использовалась для отображения текущих даты и времени. В сценарии оболочки можно использовать практически любую команду. Главное — помещать каждую команду на отдельную строку, если только вы не используете конвейеры для передачи данных между командами.

Сделаем вещи немного интереснее и рассмотрим, как получать ввод от пользователя в сценарии.


Чтение ввода от пользователя (Reading Input from the User)

До этого момента наши сценарии были неинтерактивными: пользователь просто вводил команду в приглашении командной строки, и сценарий выполнял всё, для чего был написан.

Однако сценарии можно сделать более гибкими, добавив в них интерактивность: задать пользователю вопрос и сохранить его ответ для дальнейшей обработки. Это реализуется с помощью команды echo, рассмотренной ранее, совместно с командой read. Команда echo используется для вывода вопроса пользователю. Команда read приостанавливает выполнение сценария, отображает приглашение на экране и считывает введённые пользователем данные в указанную переменную. Рассмотрим следующий пример:

#!/bin/bash
#A script for adding a directory to the PATH environment variable
echo "What directory do you want to add to the PATH?"
read MYNEWPATH
echo "You want to add " $MYNEWPATH
exit 0

В этом сценарии пользователю предлагается ввести имя каталога, который он хочет добавить в переменную окружения PATH. Команда read предоставляет пользователю приглашение для ввода имени каталога. Когда пользователь нажимает клавишу Enter, введённое значение присваивается переменной MYNEWPATH.

После того как переменная сохранена в памяти, команда echo используется повторно для вывода значения MYNEWPATH на экран. Заметим, что мы ещё не изменили переменную PATH. Для этого нужно добавить в сценарий ещё несколько команд. Лучший подход — спросить себя: «Какие команды я бы использовал в приглашении командной строки для выполнения этой задачи?» Затем следует написать эти команды в сценарии и проверить его работу.

В данном примере нам нужно добавить каталог, указанный пользователем, в переменную PATH, а затем экспортировать её. Это можно сделать с помощью команд, показанных в следующем примере:

#!/bin/bash
#A script for adding a directory to the PATH environment variable
echo "What directory do you want to add to the PATH?"
read MYNEWPATH
echo "Adding the " $MYNEWPATH " directory to PATH."
PATH=$PATH:$MYNEWPATH
export PATH
echo "Your PATH environment variable is now:"
echo $PATH
exit 0

Если у вас есть опыт программирования, вы, вероятно, заметили, что переменную MYNEWPATH нигде в сценарии не нужно объявлять заранее. Во многих языках программирования и создания сценариев переменную необходимо предварительно объявить, задать её размер и указать тип хранимых данных (текстовая строка, вещественное число, целое число, логическое значение и так далее). Оболочка bash значительно снисходительнее. Она динамически создаст переменную в памяти при выполнении команды read и присвоит ей в качестве значения введённые пользователем данные.

Разумеется, bash позволяет объявлять переменные и указывать их тип при необходимости. Для этого в сценарии используется команда declare. Это может быть полезно, если вы хотите, чтобы пользователь вводил числа через команду read. Проблема состоит в том, что оболочка bash интерпретирует всё, введённое при выполнении read, как текст — даже если пользователь вводит число. Рассмотрим следующий сценарий:

#!/bin/bash
#A script that adds variables together.
echo "Enter a number:"
read NUM1
echo "Enter a second number:"
read NUM2
TOT=$NUM1+$NUM2
echo "The sum of these numbers is " $TOT
exit 0

При запуске этот сценарий запрашивает у пользователя два числа, складывает их, присваивает результат переменной TOT и выводит её значение на экран. Обратите внимание на результат запуска сценария:

rtracy@openSUSE:~> ./addnum
Enter a number:
1
Enter a second number:
3
The sum of these numbers is             1+3

Поскольку переменные NUM1, NUM2 и TOT не были объявлены, bash обращался с ними как с простым текстом. Никакой арифметики не произошло: текстовые значения каждой переменной просто объединились в одну строку. Однако если объявить эти переменные и задать им тип целого числа, произойдёт нечто совершенно иное. Рассмотрим исправленный вариант этого сценария:

#!/bin/bash
#A script that adds variables together.
declare -i NUM1
declare -i NUM2
declare -i TOT
echo "Enter a number:"
read NUM1
echo "Enter a second number:"
read NUM2
TOT=$NUM1+$NUM2
echo "The sum of these numbers is " $TOT
exit 0

Обратите внимание, что переменные NUM1, NUM2 и TOT объявлены в начале сценария с параметром -i (целое число). Теперь оболочка bash будет интерпретировать ввод пользователя как целое число, а не как текст. При использовании оператора + над переменными в сценарии они действительно сложатся, а не объединятся в строку, как показано далее:

rtracy@openSUSE:~> ./addnum
Enter a number:
1
Enter a second number:
3
The sum of these numbers is             4

Отлично! Мы перешли от относительно простых сценариев к более сложным. Сделаем ещё один шаг и добавим в наши сценарии управляющие конструкции.