Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание - страница 12

стр.

Кроме того, чтобы сценарий различал, запускается он как самостоятельная программа или подключается другим сценарием, можно добавить в начало условный оператор:

>if ["$BASH_SOURCE" = "$0"]

Это сработает и с любым другим сценарием. Однако мы предлагаем вам, дорогой читатель, дописать остальной код после экспериментов!


ПРИМЕЧАНИЕ

Сценарий № 47 в главе 6 тесно связан с этим сценарием. Он проверяет каталоги в PATH и переменные в окружении пользователя.

№ 2. Проверка ввода: только алфавитно-цифровые символы

Пользователи постоянно игнорируют указания и вводят недопустимые данные, в неправильном формате или неправильным синтаксисом. Как разработчик сценариев командной оболочки вы должны обнаружить и отметить такие ошибки еще до того, как они превратятся в проблемы.

Часто подобные ситуации связаны с вводом имен файлов или ключей в базе данных. Программа просит пользователя ввести строку, которая должна содержать только алфавитно-цифровые символы, то есть только буквы верхнего или нижнего регистра и цифры — никаких знаков пунктуации, специальных символов и пробелов. Правильную ли строку ввел пользователь? Ответ на этот вопрос дает сценарий в листинге 1.3.

Код

Листинг 1.3. Сценарий validalnum

>#!/bin/bash

># validAlphaNum — проверяет, содержит ли строка только

># алфавитные и цифровые символы

>validAlphaNum()

>{

>··# Проверка аргумента: возвращает 0, если все символы в строке являются

>··#·· буквами верхнего/нижнего регистра или цифрами; иначе возвращает 1

>··# Удалить все недопустимые символы.

>··validchars="$(echo $1 | sed −e 's/[^[: alnum: ]]//g’)"

>··if ["$validchars" = "$1"]; then

>····return 0

>··else

>····return 1

>··fi

>}

># НАЧАЛО ОСНОВНОГО СЦЕНАРИЯ — УДАЛИТЕ ИЛИ ЗАКОММЕНТИРУЙТЕ ВСЕ, ЧТО НИЖЕ,

># ЧТОБЫ ЭТОТ СЦЕНАРИЙ МОЖНО БЫЛО ПОДКЛЮЧАТЬ К ДРУГИМ СЦЕНАРИЯМ.

># =================

>/bin/echo −n "Enter input: "

>read input

># Проверка ввода

>if! validAlphaNum "$input"; then

>··echo "Please enter only letters and numbers." >&2

>··exit 1

>else

>··echo "Input is valid."

>fi

>exit 0

Как это работает

Логика работы сценария проста: сначала с помощью редактора sed создается новая версия введенных данных, из которой удалены все недопустимые символы

. Затем новая версия сравнивается с оригиналом
. Если две версии оказались одинаковыми, все в порядке. В противном случае, если в результате обработки редактором sed потерялись данные, значит, исходная версия содержит недопустимые символы.

В основе работы сценария лежит операция подстановки редактора sed, которая удаляет любые символы, не входящие в множество [: alnum: ], где [: alnum: ] — это сокращение POSIX для регулярного выражения, соответствующего всем алфавитно-цифровым символам. Если результат операции подстановки не совпадает с исходным вводом, значит, в исходной строке присутствуют другие символы, кроме алфавитно-цифровых, недопустимые в данном случае. Функция возвращает ненулевое значение, чтобы сообщить о проблеме. Имейте в виду: в этом примере предполагается, что введенные данные являются текстом ASCII.

Запуск сценария

Сценарий содержит все необходимое для его запуска как самостоятельной программы. Он предлагает ввести строку и затем сообщает о ее допустимости. Однако чаще эта функция используется для копирования в начало другого сценария в виде ссылки, как показано в сценарии № 12.

Сценарий validalnum также представляет собой хороший пример программирования на языке командной оболочки вообще: сначала пишутся функции, а затем они тестируются перед включением в другие, более сложные сценарии. Такой подход позволяет избавиться от многих неприятностей.

Результаты

Сценарий validalnum прост в применении, он предлагает пользователю ввести строку для проверки. В листинге 1.4 показано, как сценарий реагирует на допустимый и недопустимый ввод.

Листинг 1.4. Тестирование сценария validalnum

>$ validalnum

>Enter input: valid123SAMPLE

>Input is valid.

>$ validalnum

>Enter input: this is most assuredly NOT valid, 12345

>Please enter only letters and numbers.

Усовершенствование сценария

Метод «удалить недопустимые символы и посмотреть, что осталось» хорошо подходит для проверки благодаря своей гибкости. При этом важно помнить, что обе переменные — исходная строка и шаблон — должны заключаться в двойные кавычки, чтобы избежать ошибок в случае ввода пустой строки (или пустого шаблона). Пустые значения переменных — извечная проблема в программировании сценариев, потому что при проверке в условном операторе они вызывают сообщение об ошибке. Всегда помните, что пустая строка в кавычках отличается от пустого значения переменной.