При написании сценариев Shell вы можете оказаться в ситуации, когда вам нужно выполнить действие, основанное на том, существует файл или нет.
В Bash вы можете использовать команду test, чтобы проверить, существует ли файл и определить тип файла.
Команда test принимает одну из следующих синтаксических форм:
test EXPRESSION [ EXPRESSION ] [[ EXPRESSION ]]
Если вы хотите, чтобы ваш скрипт был переносимым, вы должны предпочесть использовать старую тестовую команду [, которая доступна во всех оболочках POSIX. Новая обновленная версия команды test [[(двойные скобки) поддерживается в большинстве современных систем, использующих Bash, Zsh и Ksh в качестве оболочки по умолчанию.
При проверке, существует ли файл, чаще всего используются операторы FILE -e и -f. Первый проверит, существует ли файл независимо от типа, а второй вернет истину, только если ФАЙЛ является обычным файлом (не каталогом или устройством).
Наиболее читаемым вариантом при проверке файла является использование команды test в сочетании с оператором if. Любой из приведенных ниже фрагментов проверит, /etc/resolv.conf существует ли файл:
FILE=/etc/resolv.conf if test -f "$FILE"; then echo "$FILE существует" fi
FILE=/etc/resolv.conf if [ -f "$FILE" ]; then echo "$FILE существует" fi
FILE=/etc/resolv.conf if [[ -f "$FILE" ]]; then echo "$FILE существует" fi
Если вы хотите выполнить другое действие в зависимости от того, существует файл или нет, просто используйте конструкцию if/then:
FILE=/etc/resolv.conf if [ -f "$FILE" ]; then echo "$FILE существует" else echo "$FILE не существует" fi
Всегда используйте двойные кавычки, чтобы избежать проблем при работе с файлами, содержащими пробелы в своих именах.
Вы также можете использовать команду test без оператора if. Команда после оператора && будет выполнена только в том случае, если статус выхода команды test равен true,
test -f /etc/resolv.conf && echo "$FILE существует"
[ -f /etc/resolv.conf ] && echo "$FILE существует"
[[ -f /etc/resolv.conf ] && echo "$FILE существует"
Если вы хотите выполнить серию команд после оператора &&, просто заключите команды в фигурные скобки, разделенные ; или &&:
[ -f /etc/resolv.conf ] && { echo "$FILE существует"; cp "$FILE" /tmp/; }
Напротив оператор &&, после оператора || будет выполняться только в том случае, если статус выхода команды test равен false.
[ -f /etc/resolv.conf ] && echo "$FILE существует" || echo "$FILE не существует"
Оператор -d позволяют проверить, является ли файл каталогом или нет.
Например, чтобы проверить, /etc/docker существует ли каталог, вы должны использовать:
FILE=/etc/docker if [ -d "$FILE" ]; then echo "$FILE являться каталогом" fi
[ -d /etc/docker ] && echo "$FILE являться каталогом"
Вы также можете использовать двойные скобки [[ вместо одной [.
Как и во многих других языках, тестовое выражение можно отменить, используя логический оператор ! (восклицательный знак):
FILE=/etc/docker if [ ! -f "$FILE" ]; then echo "$FILE существует, и это каталог" fi
То же, что и выше:
[ ! -f /etc/docker ] || echo "$FILE не существует"
Вместо использования сложных вложенных конструкций if/else вы можете использовать -a (или && с [[), чтобы проверить, существует ли несколько файлов:
FILE=/etc/docker if [ -f /etc/resolv.conf -a -f /etc/hosts ]; then echo "$FILE это каталог" fi
FILE=/etc/docker if [ -f /etc/resolv.conf && -f /etc/hosts ]; then echo "$FILE iэто каталог" fi
Эквивалентные варианты без использования оператора IF:
[ -f /etc/resolv.conf -a -f /etc/hosts ] && echo "оба файла существуют"
[[ -f /etc/resolv.conf && -f /etc/hosts ]] && echo "оба файла существуют"
Команда test включает в себя следующие операторы FILE, которые позволяют тестировать определенные типы файлов:
В этой статье мы показали, как проверить, существует ли файл или каталог с помощью Bash.
Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.