
При написании скриптов Shell вы можете оказаться в ситуации, когда вам необходимо выполнить действие в зависимости от того, существует файл или нет.
В Bash вы можете использовать команду test для проверки существования файла и определения его типа.
Тестовая команда принимает одну из следующих синтаксических форм:
test EXPRESSION [ EXPRESSION ] [[ EXPRESSION ]]
Если вы хотите, чтобы ваш скрипт был переносимым, используйте старую команду test [ , доступную во всех оболочках POSIX. Новая обновлённая версия команды test [[ (двойные скобки) поддерживается большинством современных систем, использующих Bash, Zsh и Ksh в качестве оболочек по умолчанию.
Проверить, существует ли файл
При проверке существования файла наиболее часто используются операторы FILE -e и -f . Первый проверяет существование файла независимо от его типа, а второй возвращает true только в том случае, если FILE является обычным файлом (не каталогом или устройством).
Наиболее удобный способ проверки существования файла — использовать команду test в сочетании с оператором if . Любой из приведённых ниже фрагментов проверит существование файла /etc/resolv.conf :
FILE = /etc/resolv.conf if test -f " $FILE " ; then echo " $FILE exists." fi
FILE = /etc/resolv.conf if [ -f " $FILE " ] ; then echo " $FILE exists." fi
FILE = /etc/resolv.conf if [[ -f " $FILE " ]] ; then echo " $FILE exists." fi
Если вы хотите выполнить другое действие в зависимости от того, существует файл или нет, используйте конструкцию if/then:
FILE = /etc/resolv.conf if [ -f " $FILE " ] ; then echo " $FILE exists." else echo " $FILE does not exist." fi
Всегда используйте двойные кавычки , чтобы избежать проблем при работе с файлами, содержащими пробелы в именах.
Вы также можете использовать тестовую команду без оператора if. Команда после оператора && будет выполнена только в том случае, если код завершения тестовой команды — true.
test -f /etc/resolv.conf && echo " $FILE exists."
[ -f /etc/resolv.conf ] && echo " $FILE exists."
[[ -f /etc/resolv.conf ]] && echo " $FILE exists."
Если вы хотите выполнить серию команд после оператора && , заключите команды в фигурные скобки, разделив их символами ; или && :
[ -f /etc/resolv.conf ] && { echo " $FILE exist." ; cp " $FILE " /tmp/ ; }
В отличие от && , оператор после оператора || будет выполнен только в том случае, если статус выхода тестовой команды — false .
[ -f /etc/resolv.conf ] && echo " $FILE exist." || echo " $FILE does not exist."
Проверить, существует ли каталог
Флаг -d позволяет проверить, является ли файл каталогом или нет.
Например, чтобы проверить, существует ли каталог /etc/docker , можно использовать:
FILE = /etc/docker if [ -d " $FILE " ] ; then echo " $FILE is a directory." fi
[ -d /etc/docker ] && echo " $FILE is a directory."
Вы также можете использовать двойные скобки [[ вместо одинарных [ .
Проверить, не существует ли файл
Как и во многих других языках, тестовое выражение можно отменить с помощью логического оператора «НЕ ! (восклицательный знак):
FILE = /etc/docker if [ ! -f " $FILE " ] ; then echo " $FILE does not exist." fi
То же, что и выше:
[ ! -f /etc/docker ] && echo " $FILE does not exist."
Проверить, существует ли несколько файлов
Вместо использования сложных вложенных конструкций if/else вы можете использовать -a (или && с [[ ) для проверки существования нескольких файлов:
if [ -f /etc/resolv.conf -a -f /etc/hosts ] ; then echo "Both files exist." fi
if [[ -f /etc/resolv.conf && -f /etc/hosts ]] ; then echo "Both files exist." fi
Эквивалентные варианты без использования оператора IF:
[ -f /etc/resolv.conf -a -f /etc/hosts ] && echo "Both files exist."
[[ -f /etc/resolv.conf && -f /etc/hosts ]] && echo "Both files exist."
Операторы проверки файлов
Команда test включает следующие операторы FILE, которые позволяют тестировать определенные типы файлов:
-
-bFILE— Истина, если ФАЙЛ существует и является специальным блочным файлом. -
-cFILE— Истина, если ФАЙЛ существует и является файлом специальных символов. -
-dFILE— Истина, если ФАЙЛ существует и является каталогом. -
-eFILE— Истина, если ФАЙЛ существует и является файлом, независимо от типа (узел, каталог, сокет и т. д.). -
-fFILE— Истина, если ФАЙЛ существует и является обычным файлом (не каталогом или устройством). -
-GFILE— Истина, если ФАЙЛ существует и имеет ту же группу, что и пользователь, запускающий команду. -
-hFILE— Истина, если ФАЙЛ существует и является символической ссылкой. -
-gFILE— Истина, если ФАЙЛ существует и для него установлен флаг set-group-id (sgid). -
-kFILE— Истина, если ФАЙЛ существует и для него установлен флаг липкого бита. -
-LFILE— Истина, если ФАЙЛ существует и является символической ссылкой. -
-OFILE— Истина, если ФАЙЛ существует и принадлежит пользователю, выполнившему команду. -
-pFILE— Истина, если ФАЙЛ существует и является каналом. -
-rFILE— Истина, если ФАЙЛ существует и доступен для чтения. -
-SFILE— Истина, если ФАЙЛ существует и является сокетом. -
-sFILE— Истина, если ФАЙЛ существует и имеет ненулевой размер. -
-uFILE— Истина, если ФАЙЛ существует и установлен флаг set-user-id (suid). -
-wFILE— Истина, если ФАЙЛ существует и доступен для записи. -
-xFILE— True, если ФАЙЛ существует и является исполняемым.
Заключение
В этом руководстве мы показали, как проверить существование файла или каталога в Bash. Подробнее о команде test можно узнать, введя в терминале man test .
Если у вас есть вопросы или пожелания, не стесняйтесь оставлять комментарии.
Связанные руководства