Изучение операторов тестирования файлов в Bash с примерами

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 без них.

# Представляет файл, который вы хотите протестировать.
# Замените file_name именем целевого файла для тестирования.
FILE="file_name"
# Оператор - оператор тестирования файла, который следует использовать.
if [ Operator $FILE ]

then
 # Задачи для выполнения, если оператор возвращает true.
 do something

else
 # Задачи для выполнения, если оператор возвращает false.
 do something

fi

Проверка наличия файла

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

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

Чтобы проверить, существует ли файл:

1. Откройте терминал и выполните нижеприведенную команду touch, чтобы создать новый файл test.txt. Эта команда не выводит результат, но вы проверите файл на следующем шаге.

touch test.txt

2. Затем выполните следующую команду ls, чтобы отобразить вновь созданный файл (test.txt) в вашем рабочем каталоге.

ls -al test.txt

Результат ниже подтверждает успешное создание файла test.txt.

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

Listing the newly-created file

3. Выполните нижеприведенную команду, чтобы создать (touch) и открыть новый файл сценария оболочки (if_file_exists.sh) в вашем предпочитаемом текстовом редакторе (например, nano).

touch if_file_exists.sh && nano if_file_exists.sh

4. Теперь добавьте следующий код в ваш новый файл if_file_exists.sh, сохраните файл и закройте редактор.

  • Запускает условный оператор if-else для проверки существования указанного файла.
  • Если оператор возвращает true, вы получите сообщение о том, что файл существует.
  • Если оператор возвращает true, вы получите сообщение о том, что файл не существует. Но на этот раз файл автоматически создается с именем, которое вы определили в переменной FILE.

Строка #!/bin/bash вверху файла известна как shebang. Shebang сообщает вашей системе, какой интерпретатор использовать для выполнения сценария, в данном случае Bash. Если вы не включите shebang, ваша система использует интерпретатор по умолчанию, который может быть не Bash. Отсутствие shebang может привести к сбою вашего сценария.

#!/bin/bash
# FILE - переменная, которая содержит значение файла, который вы хотите проверить.
# Вы можете повторно использовать этот же блок кода для проверки разных файлов 
  # изменяя значение переменной $FILE.
FILE="test.txt"

# Оператор -е проверяет наличие файла
if [ -e $FILE ]
then
  # Если оператор возвращает true, выводится сообщение о том, что файл существует.
  echo "$FILE exists"
else
  # Если оператор возвращает true, выводится сообщение о том, что файла не существует,
    # а затем создается файл с именем, которое вы определили в переменной FILE.
  echo "$FILE does not exist, creating new file" && touch test.txt
fi

5. Запустите нижеприведенную команду, чтобы выполнить ваш новый сценарий (if_file_exists.sh)

bash if_file_exists.sh

Если все пройдет успешно, вы увидите сообщение о существовании test.txt, выведенное в ваш терминал, как показано ниже.

test.txt exists

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

rm -rf test.txt
ls test.txt

Ниже вы можете проверить, что test.txt больше не отображается.

Deleting the test file

7. Повторно выполните нижеприведенную команду, чтобы выполнить ваш сценарий if_file_exists.sh.

Поскольку файл test.txt больше не существует, скрипт создает новый файл test.txt, когда оператор -e возвращает false.

bash if_file_exists.sh
Rerun your if_file_exists.sh script

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

ls -al test.txt

Ниже приведенный вывод подтверждает, что ваш сценарий создал новый файл test.txt.

Listing the new test.txt file

Проверка, является ли файл обычным или специальным файлом

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

Например, распространенная ошибка при открытии специального файла – это ошибка “Нет такого файла или каталога”. Эта ошибка возникает, когда файл, который вы пытаетесь открыть, не существует. Но та же ошибка также может возникнуть при открытии специального файла вместо обычного.

Откройте новый файл special_file.sh в вашем текстовом редакторе, добавьте следующий код и сохраните изменения.

Код ниже похож на предыдущий. Но в этом коде используется оператор -f вместо оператора -e. Оператор -f проверяет, является ли указанный файл (/dev/vmmon) обычным файлом.

#!/bin/bash
# Файл /dev/vmmon является специальным файлом
  # используемым для взаимодействия с аппаратными устройствами в Linux.
FILE="/dev/vmmon"

# Проверяем, существует ли файл
if [ -f $FILE ]
then
  # Если оператор возвращает true, вы получите сообщение о том, что
    # файл является обычным файлом.
  echo "$FILE is a regular file"

else
  # Если оператор возвращает true, вы получите сообщение о том, что 
    # файл либо не существует, либо является обычным файлом.
  echo "Either $FILE does not exist or is not a regular file"

fi

Теперь выполните команду ниже, чтобы выполнить ваш сценарий special_file.sh.

bash special_file.sh

Поскольку файл (/dev/vmmon), указанный в переменной FILE, является специальным файлом, вы получите сообщение ниже.

Checking if a file is a regular file

Проверка существования каталога

До сих пор вы узнали, как проверить существование файла. Но применим ли тот же метод к каталогам? Да, используя оператор проверки -d. Этот оператор пригодится, если вы планируете предпринять действия в зависимости от того, существует ли каталог или нет.

Возможно, вы хотите скопировать все файлы из одного каталога в другой. Если целевой каталог не существует, вы можете создать его перед копированием файлов.

1. Запустите команду ls ниже, чтобы перечислить example-dir из рабочего каталога.

ls -la example-dir

Вы получите сообщение, говорящее “Нет такого файла или каталога”, так как каталог не существует. Если вы не хотите, чтобы ваш поток был прерван только из-за отсутствия каталога, перейдите к следующему шагу.

Listing the example-dir from the working directory

2. Затем откройте новый файл с именем if_dir_exists.sh в вашем текстовом редакторе, добавьте нижеследующий код и сохраните файл. Следующий код проверяет существование указанного каталога и выполняет задачи в зависимости от того, какое значение возвращает оператор -d.

Вы можете достичь того же результата, переключив операторы if и else, используя отрицательный оператор (!). В реальных ситуациях оператор ! может помочь написать более чистый и краткий скрипт.

#!/bin/bash
# Определите имя каталога в переменной dir
dir=example_dir

# Проверьте, существует ли каталог (dir)
if [ ! -d $dir ]
then
  # Если оператор возвращает true, создайте каталог по значению переменной dir
  mkdir $dir
  # Скопируйте файл test.txt в только что созданный каталог
  cp test.txt $dir
  # Выводит сообщение о выполненных выше задачах.
  echo "The directory has been created, and the test.txt file has been copied."
else
  # Если оператор возвращает false, 
    # команда echo выводит сообщение о том, что каталог существует.
  echo "Directory $dir exists"
fi

3. Теперь запустите нижеуказанную команду, чтобы выполнить ваш скрипт (if_dir_exists.sh)

bash if_dir_exists.sh

Можно увидеть сообщение о том, что каталог был создан, а файл test.txt был скопирован, так как example_dir не существует.

Executing the if_dir_exists.sh to test if a directory exists

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

ls -la example_dir
Confirming the example_dir directory exists and contains the test.txt file

Проверка наличия содержимого в файле

Вы уже знаете, как использовать три наиболее часто используемых оператора тестирования файлов (-e, -f и -d) для улучшения навыков написания сценариев. Но существуют и другие операторы, которые вам было бы интересно изучить.

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

Почему бы не воспользоваться оператором -s, чтобы проверить, существует ли файл и не является ли он пустым? Этот оператор возвращает true, если файл существует и имеет размер больше нуля.

1. Откройте новый файл с именем empty_file.sh в вашем текстовом редакторе, добавьте следующий код и сохраните файл.

Следующий код проверяет, является ли указанный файл пустым, и выводит сообщение в зависимости от того, какое значение возвращает оператор -s.

#!/bin/bash
# Определяет имя целевого файла
FILE=test.txt

# Оператор -s проверяет, существует ли целевой файл и не пуст ли он
if [ -s $FILE ]
then
  # Если оператор возвращает true, команда echo выводит сообщение
    # сообщающее, что файл существует и не пуст.
  echo "$FILE exists and is not empty"
else
  # Если оператор возвращает false, команда echo выводит сообщение 
    # сообщающее, что файл либо не существует, либо пуст.
  echo "$FILE either does not exist or is empty"
  # Добавляет текст в целевой файл
  echo "This is a test. This is not an empty file" > $FILE
fi

2. Теперь запустите нижеуказанную команду для выполнения вашего скрипта (empty_file.sh).

bash empty_file.sh

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

Executing the empty_file.sh file to test if the text.txt file is empty

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

cat test.text
Verifying the text.txt file’s content

4. Наконец, повторно запустите команду bash ниже для выполнения скрипта empty_file.sh.

bash empty_file.sh

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

Rerunning the empty_file.sh script to check if the test.txt file is empty

Проверка существования файла и его доступности для чтения

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

Для демонстрации проверки существования и доступности файла:

1. Выполните следующую команду для входа в другую учетную запись пользователя (ata).

su - ata

Ваш приглашение изменится ($) для указания того, что вы вошли под другим пользователем.

Logging in to another user account

В качестве альтернативы вы можете изменить разрешение файла на чтение, запись или оба с помощью команды chmod.

2. После входа создайте новый файл с именем readable_file.sh с помощью вашего текстового редактора

Добавьте следующий код в файл readable_file.sh и сохраните изменения. Этот код проверяет, существует ли файл с именем test.txt в каталоге /root и доступен ли он для чтения.

#!/bin/bash
# Определите целевой файл
FILE=test.txt

# Проверьте, доступен ли целевой файл для чтения.
# Вы можете заменить -r на -w, чтобы проверить, доступен ли файл для записи.
if [ -r $FILE ] 
then  
  # Если оператор возвращает true, выведите сообщение о том,
    # что файл существует и доступен для чтения.
  echo "$FILE exists and is readable" 
else  
  # Если оператор возвращает false, выведите сообщение о том,
    # что файл либо не существует, либо недоступен для чтения.  
  echo "$FILE does not exist or is unreadable"
fi

3. Теперь выполните следующую команду для выполнения сценария readable_file.sh.

bash readable_file.sh

На этот раз вы увидите сообщение о том, что файл /root/test.txt не существует или не доступен для чтения. Поскольку файл text.test находится в каталоге /root, текущему пользователю (ata) не хватает прав на чтение файла text.txt.

Executing the readable_file.sh script

4. Наконец, выполните следующие команды, чтобы сделать следующее:

  • Измените файл sudoers, чтобы текущий пользователь (ata) мог использовать sudo для запуска повышенных команд.
  • Запустите скрипт readable_file.sh, который проверяет, доступен ли определенный файл для чтения.
sudo bash
bash readable_file.sh

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

Changing the sudoers file and executing the readable_file.sh script

Заключение

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.

Почему бы не попробовать проверить расширение файла? Или, быть может, проверить наличие нескольких файлов, чтобы убедиться, что все необходимые файлы доступны?

Source:
https://adamtheautomator.com/bash-file-test/