Bash – невероятно гибкая и предлагает различные варианты тестирования файлов. И если вы ищете способ проверить ваши файлы, операторы тестирования файлов Bash помогут вам.
В этом руководстве вы узнаете различные операторы тестирования файлов и как использовать их для проверки существования файла, его читаемости, пустоты и так далее.
Читайте далее и подружитесь с операторами тестирования файлов Bash!
Предпосылки
Это руководство будет практической демонстрацией. Если вы хотите следовать за нами, убедитесь, что у вас есть следующее:
- A Linux system with Bash installed – This tutorial uses Ubuntu 20.04.
Большинство дистрибутивов Linux по умолчанию устанавливают Bash. Но если вы используете Windows, вы можете установить Подсистему Windows для Linux (WSL), чтобы получить оболочку Bash.
- A user account with sudo privileges to run commands as root – This tutorial uses a root account for simplicity. But using a non-root user with sudo access is always recommended.
- Это руководство предполагает, что у вас есть доступ по SSH к вашей системе Linux.
Что такое операторы тестирования файлов в Bash?
Прежде чем приступить к использованию операторов тестирования, давайте посмотрим, как они работают. Операторы тестирования файлов позволяют проверять различные аспекты файла, такие как наличие файла, возможность чтения/записи и т. д.
Использование операторов тестирования файлов может помочь предотвратить ошибки в ваших сценариях Bash. Приведенный ниже код является шаблоном для оператора if. Оператор if-else – мощный инструмент, который вы часто увидите в сценариях Bash.
Помните, что части кодового блока then и else являются необязательными. Вы можете использовать оператор if без них.
Проверка наличия файла
Вы уже видели, как работают операторы тестирования, но этого недостаточно для лучшего понимания всех тонкостей их использования. Давайте начнем с базового примера, например, проверки существования файла.
В реальном мире вам может понадобиться проверить существование файла конфигурации перед его созданием. Вы не хотите тратить время на создание файла конфигурации с нуля, чтобы затем обнаружить, что такой файл уже существует.
Чтобы проверить, существует ли файл:
1. Откройте терминал и выполните нижеприведенную команду touch, чтобы создать новый файл test.txt. Эта команда не выводит результат, но вы проверите файл на следующем шаге.
2. Затем выполните следующую команду ls, чтобы отобразить вновь созданный файл (test.txt) в вашем рабочем каталоге.
Результат ниже подтверждает успешное создание файла test.txt.
Теперь, когда у вас есть тестовый файл, вы можете использовать этот образец кода в сценарии Bash для проверки существования файла на следующих шагах.

3. Выполните нижеприведенную команду, чтобы создать (touch) и открыть новый файл сценария оболочки (if_file_exists.sh) в вашем предпочитаемом текстовом редакторе (например, nano).
4. Теперь добавьте следующий код в ваш новый файл if_file_exists.sh, сохраните файл и закройте редактор.
- Запускает условный оператор if-else для проверки существования указанного файла.
- Если оператор возвращает true, вы получите сообщение о том, что файл существует.
- Если оператор возвращает true, вы получите сообщение о том, что файл не существует. Но на этот раз файл автоматически создается с именем, которое вы определили в переменной FILE.
Строка #!/bin/bash вверху файла известна как shebang. Shebang сообщает вашей системе, какой интерпретатор использовать для выполнения сценария, в данном случае Bash. Если вы не включите shebang, ваша система использует интерпретатор по умолчанию, который может быть не Bash. Отсутствие shebang может привести к сбою вашего сценария.
5. Запустите нижеприведенную команду, чтобы выполнить ваш новый сценарий (if_file_exists.sh)
Если все пройдет успешно, вы увидите сообщение о существовании test.txt, выведенное в ваш терминал, как показано ниже.

6. Затем выполните следующие команды для удаления (rm -rf) файла test (test.txt) и перечисления всех файлов в вашем рабочем каталоге.
Ниже вы можете проверить, что test.txt больше не отображается.

7. Повторно выполните нижеприведенную команду, чтобы выполнить ваш сценарий if_file_exists.sh.
Поскольку файл test.txt больше не существует, скрипт создает новый файл test.txt, когда оператор -e возвращает false.

8. Наконец, выполните команду ls ниже, чтобы перечислить файл test.txt в вашем рабочем каталоге.
Ниже приведенный вывод подтверждает, что ваш сценарий создал новый файл test.txt.

Проверка, является ли файл обычным или специальным файлом
Прежде чем открывать или обрабатывать файл, вам может захотеться сначала проверить, является ли этот файл обычным или специальным. Почему? Специальный файл – это тип файла, хранящийся в файловой системе, поэтому будьте осторожны, чтобы не портить эти файлы.
Например, распространенная ошибка при открытии специального файла – это ошибка “Нет такого файла или каталога”. Эта ошибка возникает, когда файл, который вы пытаетесь открыть, не существует. Но та же ошибка также может возникнуть при открытии специального файла вместо обычного.
Откройте новый файл special_file.sh в вашем текстовом редакторе, добавьте следующий код и сохраните изменения.
Код ниже похож на предыдущий. Но в этом коде используется оператор -f
вместо оператора -e
. Оператор -f
проверяет, является ли указанный файл (/dev/vmmon
) обычным файлом.
Теперь выполните команду ниже, чтобы выполнить ваш сценарий special_file.sh
.
Поскольку файл (/dev/vmmon), указанный в переменной FILE
, является специальным файлом, вы получите сообщение ниже.

Проверка существования каталога
До сих пор вы узнали, как проверить существование файла. Но применим ли тот же метод к каталогам? Да, используя оператор проверки -d
. Этот оператор пригодится, если вы планируете предпринять действия в зависимости от того, существует ли каталог или нет.
Возможно, вы хотите скопировать все файлы из одного каталога в другой. Если целевой каталог не существует, вы можете создать его перед копированием файлов.
1. Запустите команду ls ниже, чтобы перечислить example-dir из рабочего каталога.
Вы получите сообщение, говорящее “Нет такого файла или каталога”, так как каталог не существует. Если вы не хотите, чтобы ваш поток был прерван только из-за отсутствия каталога, перейдите к следующему шагу.

2. Затем откройте новый файл с именем if_dir_exists.sh в вашем текстовом редакторе, добавьте нижеследующий код и сохраните файл. Следующий код проверяет существование указанного каталога и выполняет задачи в зависимости от того, какое значение возвращает оператор -d.
Вы можете достичь того же результата, переключив операторы if и else, используя отрицательный оператор (!). В реальных ситуациях оператор ! может помочь написать более чистый и краткий скрипт.
3. Теперь запустите нижеуказанную команду, чтобы выполнить ваш скрипт (if_dir_exists.sh)
Можно увидеть сообщение о том, что каталог был создан, а файл test.txt был скопирован, так как example_dir не существует.

4. Наконец, выполните команду ls для каталога example_dir , чтобы подтвердить существование каталога и наличие файла test.txt.

Проверка наличия содержимого в файле
Вы уже знаете, как использовать три наиболее часто используемых оператора тестирования файлов (-e
, -f
и -d
) для улучшения навыков написания сценариев. Но существуют и другие операторы, которые вам было бы интересно изучить.
Обычно вместо выделения содержимого файла для копирования в другой файл вы бы запускали команду, чтобы сделать это за вас. Но подождите, так как ваш целевой файл может быть не пустым.
Почему бы не воспользоваться оператором -s
, чтобы проверить, существует ли файл и не является ли он пустым? Этот оператор возвращает true, если файл существует и имеет размер больше нуля.
1. Откройте новый файл с именем empty_file.sh в вашем текстовом редакторе, добавьте следующий код и сохраните файл.
Следующий код проверяет, является ли указанный файл пустым, и выводит сообщение в зависимости от того, какое значение возвращает оператор -s.
2. Теперь запустите нижеуказанную команду для выполнения вашего скрипта (empty_file.sh).
Ниже вы можете увидеть сообщение, говорящее, что test.txt либо не существует, либо пуст. Но в то же время скрипт добавляет текст в файл test.txt.

3. Запустите команду cat ниже, чтобы проверить, содержит ли файл test.txt добавленный текст.

4. Наконец, повторно запустите команду bash ниже для выполнения скрипта empty_file.sh.
Ниже вы можете увидеть, что вывод изменился на test.txt существует и не пуст, поскольку файл test.txt теперь содержит некоторый текст и имеет размер больше нуля (0).

Проверка существования файла и его доступности для чтения
Возможно, ваша автоматизация включает в себя чтение файлов для выполнения задач. Успех этих задач будет зависеть от того, доступны ли файлы для чтения. Написание скрипта для проверки существования файла и его доступности для чтения будет полезным решением.
Для демонстрации проверки существования и доступности файла:
1. Выполните следующую команду для входа в другую учетную запись пользователя (ata).
Ваш приглашение изменится ($) для указания того, что вы вошли под другим пользователем.

В качестве альтернативы вы можете изменить разрешение файла на чтение, запись или оба с помощью команды chmod.
2. После входа создайте новый файл с именем readable_file.sh с помощью вашего текстового редактора
Добавьте следующий код в файл readable_file.sh и сохраните изменения. Этот код проверяет, существует ли файл с именем test.txt в каталоге /root и доступен ли он для чтения.
3. Теперь выполните следующую команду для выполнения сценария readable_file.sh.
На этот раз вы увидите сообщение о том, что файл /root/test.txt не существует или не доступен для чтения. Поскольку файл text.test находится в каталоге /root, текущему пользователю (ata) не хватает прав на чтение файла text.txt.

4. Наконец, выполните следующие команды, чтобы сделать следующее:
- Измените файл sudoers, чтобы текущий пользователь (ata) мог использовать
sudo
для запуска повышенных команд.
- Запустите скрипт readable_file.sh, который проверяет, доступен ли определенный файл для чтения.
Вы можете видеть ниже, что вывод показывает, что test.txt существует и доступен для чтения, потому что пользователь ata теперь имеет права на чтение файла test.txt.

Заключение
A testing phase is always a priority before making drastic changes, whether on files or directories on your system. And in this tutorial, you’ve learned about the Bash file test operators and how to use them to test if a file (regular or special) or directory exists or if a file is readable or not.
С этими новыми навыками вы можете уверенно решать, какое действие предпринять на основе результатов тестов. Но есть много других способов использования операторов тестирования файлов Bash.
Почему бы не попробовать проверить расширение файла? Или, быть может, проверить наличие нескольких файлов, чтобы убедиться, что все необходимые файлы доступны?