Чтение онлайн

ЖАНРЫ

Командная строка Linux
Шрифт:

Командной оболочкой поддерживаются две чрезвычайно простые встроенные коман­ды, которые просто завершаются с кодом 0 или 1. Команда true всегда завершается с признаком успеха, а команда false — всегда с признаком ошибки:

[me@linuxbox ~]$ true

[me@linuxbox ~]$ echo $?

0

[me@linuxbox ~]$ false

[me@linuxbox ~]$ echo $?

1

Эти команды можно использовать для исследования особенностей работы инструкции if. Инструкция if в действительности просто оценивает код завершения команды:

[me@linuxbox ~]$ if true; then echo "It's true."; fi

It's true.

[me@linuxbox ~]$ if false; then echo "It's true."; fi

[me@linuxbox ~]$

Команда echo "It's true."

выполняется, только если команда, следующая за if, завершается успешно, и не выполняется, если команда, следующая за if, завершается с признаком ошибки. Если за if следует список команд, успешность выполнения всего списка определяется по последней команде:

[me@linuxbox ~]$ if false; true; then echo "It's true."; fi

It's true.

[me@linuxbox ~]$ if true; false; then echo "It's true."; fi

[me@linuxbox ~]$

Команда test

Вне всяких сомнений, чаще всего с инструкцией if используется команда test. Команда test может выполнять различные проверки и сравнения. Она имеет две эквивалентные формы:

test выражение

и более популярную

[ выражение ]

где выражение возвращает истинное (true) или ложное (false) значение. Команда test возвращает код завершения 0, если выражение истинно, и код завершения 1, если выражение ложно.

Выражения для проверки файлов

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

Таблица 27.1. Выражения для проверки файлов

Выражение

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

файл1 -ef файл2

файл1 и файл2 имеют одно и то же число индексного узла (inode; то есть два имени принадлежат жестким ссылкам, ссылающимся на один и тот же файл)

файл1 -nt файл2

файл1 новее файла файл2

файл1 -ot файл2

файл1 старше файла файл2

– b файл

файл существует и является специальным файлом блочного устройства

– с файл

файл существует и является специальным файлом символьного устройства

– d файл

файл существует и является каталогом

– e файл

файл существует

– f файл

файл существует и является обычным файлом

– g файл

файл существует и имеет атрибут set-group-ID (бит setgid)

– G файл

файл существует и принадлежит действующей группе

– k файл

файл существует и имеет атрибут «sticky bit»

– L файл

файл существует и является символической ссылкой

– O файл

файл существует и принадлежит действующему пользователю

– p файл

файл существует и является именованным каналом

– r файл

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

– s файл

файл существует и имеет размер больше нуля

– S

файл

файл существует и является сетевым сокетом

– t дескриптор_файла

дескриптор_файла представляет файл, подключенный к терминалу. Это выражение можно использовать для проверки стандартных потоков ввода/вывода/ошибок

– u файл

файл существует и имеет атрибут setuid

– w файл

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

– x файл

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

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

#!/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."

Поделиться с друзьями: