Добавить в цитаты Настройки чтения

Страница 91 из 113

файл существует и доступен для выполнения (имеет разрешение на выполнение для действующего пользователя)

Следующий сценарий демонстрирует применение некоторых выражений с файлами:

#!/bin/bash

# test-file: проверка файла

FILE=~/.bashrc

if [ -e "$FILE" ]; then

        if [ -f "$FILE" ]; then

                echo "$FILE is a regular file."

        fi

        if [ -d "$FILE" ]; then

                echo "$FILE is a directory."

        fi

        if [ -r "$FILE" ]; then

                echo "$FILE is readable."

        fi

        if [ -w "$FILE" ]; then

                echo "$FILE is writable."

        fi

        if [ -x "$FILE" ]; then

                echo "$FILE is executable/searchable."

        fi

else

        echo "$FILE does not exist"

        exit 1

fi

exit

Сценарий проверяет файл, имя которого присвоено константе FILE, и выводит результат. Этот сценарий имеет две интересные особенности, на которые следует обратить внимание. Во-первых, отметьте, что параметр $FILE внутри выражений заключен в кавычки. Это не является обязательным требованием, но защищает от случаев, когда параметр пуст. Если механизм подстановки заменит $FILE пустым значением, это приведет к ошибке (операторы в этом случае будут интерпретироваться как непустые строки, а не как операторы). Использование кавычек гарантирует, что за оператором всегда будет следовать строка, даже если она пустая. Во-вторых, обратите внимание на команду exit (в конце сценария). Команда exit принимает единственный необязательный аргумент, определяющий код возврата сценария. В отсутствие аргумента exit вернет значение по умолчанию 0. Такое использование exit позволит сценарию сообщить об ошибке, если в $FILE содержится имя несуществующего файла. Команда exit в самом конце сценария добавлена исключительно для формальности. Когда командная оболочка достигает конца сценария (то есть конца файла), она в любом случае завершает выполнение сценария с кодом завершения 0.

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

test_file () {

        # test-file: проверка файла

        FILE=~/.bashrc

        if [ -e "$FILE" ]; then

                if [ -f "$FILE" ]; then

                        echo "$FILE is a regular file."

                fi

                if [ -d "$FILE" ]; then

                        echo "$FILE is a directory."

                fi

                if [ -r "$FILE" ]; then

                        echo "$FILE is readable."

                fi

                if [ -w "$FILE" ]; then

                        echo "$FILE is writable."

                fi

                if [ -x "$FILE" ]; then

                        echo "$FILE is executable/searchable."

                fi

        else

                echo "$FILE does not exist"

                return 1

        fi

}

Выражения для проверки строк

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

Таблица 27.2. Выражения для проверки строк

Выражение

Истинно, если...

строка

Cтрока не пустая

-n строка

Длина строки больше нуля

-z строка

Длина строки равна нулю

строка1 = строка2

строка1 == строка2

строка1 и строка2 равны. Допускается использовать один или два знака «равно», но предпочтительнее два

строка1 != строка2

строка1 и строка2 не равны



строка1 > строка2

строка1 больше, чем строка2, в смысле алфавитной сортировки

строка1 < строка2

строка1 меньше, чем строка2, в смысле алфавитной сортировки

ВНИМАНИЕ

При использовании с командой test операторы > и < необходимо заключать в кавычки (или экранировать символом обратного слеша). Если этого не сделать, они будут интерпретироваться командной оболочкой как операторы перенаправления, что может привести к плачевным результатам. Обратите также внимание: в документации к командной оболочке bash утверждается, что порядок сортировки соответствует порядку алфавитной сортировки, определяемому текущими региональными настройками, но в действительности это не так. В версиях bash, вплоть до 4.0, используется порядок сор­тировки ASCII (POSIX).

Следующий сценарий демонстрирует применение выражений для проверки строк:

#!/bin/bash

# test-string: проверка значения строки

ANSWER=maybe

if [ -z "$ANSWER" ]; then

        echo "There is no answer." >&2

        exit 1

fi

if [ "$ANSWER" == "yes" ]; then

        echo "The answer is YES."

elif [ "$ANSWER" == "no" ]; then

        echo "The answer is NO."

elif [ "$ANSWER" == "maybe" ]; then

        echo "The answer is MAYBE."

else

        echo "The answer is UNKNOWN."

fi

В этом сценарии определяется константа ANSWER. Сначала сценарий проверяет, не является ли строка пустой. Если строка пустая, сценарий завершается с кодом 1. Обратите внимание на оператор перенаправления в команде echo. Он перенаправляет сообщение об ошибке «There is no answer» («Нет ответа») в стандартный вывод ошибок как «наиболее подходящий» для сообщений об ошибках. Если строка не пустая, сценарий сравнивает ее значение со строками «yes», «no» или «maybe». Проверки выполняются с использованием инструкции elif, которая является краткой формой записи для else if. Инструкция elif позволяет конструировать более сложные логические проверки.

Выражения для проверки целых чисел

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

Таблица 27.3. Выражения для проверки целых чисел

Выражение

Истинно, если...

число1 -eq число2

число1 и число2 равны

число1 -ne число2

число1 и число2 не равны

число1 -le число2

число1 меньше или равно числу2

число1 -lt число2

число1 меньше, чем число2

число1 -ge число2

число1 больше или равно числу2

число1 -gt число2

число1 больше, чем число2

Следующий сценарий демонстрирует их применение:

#!/bin/bash

# test-integer: проверка целочисленного значения.

INT=-5

if [ -z "$INT" ]; then

        echo "INT is empty." >&2

        exit 1

fi

if [ $INT -eq 0 ]; then

        echo "INT is zero."

else

        if [ $INT -lt 0 ]; then

                echo "INT is negative."

        else

                echo "INT is positive."

        fi

        if [ $((INT % 2)) -eq 0 ]; then

                echo "INT is even."

        else

                echo "INT is odd."

        fi

fi

Обратите внимание на то, как сценарий определяет четность (even) или нечетность (odd) целого числа. Он возвращает остаток от деления числа на 2, по значению которого можно судить о четности или нечетности числа.

Более современная версия команды test

Последние версии bash реализуют составную команду, которая действует как улучшенная замена для команды test. Она имеет следующий синтаксис: