Квадратная скобка '[' как отдельная команда Linux

Введение

Большинство пользователей воспринимает открывающую квадратную скобку [ исключительно как элемент синтаксиса оператора if в командных оболочках. Однако в экосистеме Unix/Linux за этим символом скрывается полноценная исполняемая утилита. В данном руководстве разберем физическую природу команды [, особенности ее обработки командным процессором, а также способы извлечения и интерпретации статуса завершения $? при решении практических задач автоматизации.

1. Локализация бинарного файла и механизм разрешения имени команды

Для проверки физического присутствия утилиты в файловой иерархии воспользуемся вызовом which [:
Система возвращает абсолютный путь /usr/bin/[. Это наглядно демонстрирует, что квадратная скобка представляет собой автономный исполняемый модуль операционной системы, а не просто абстрактный управляющий знак интерпретатора.

⚙️ [Ключевые предикаты проверки условий]

-f : возвращает истину, если указанный путь указывает на обычный файл.
-d : определяет, является ли целевой объект каталогом.
-e : валидирует сам факт существования узла (файла или каталога) на диске.
-z : фиксирует нулевую длину строкового значения (проверка на пустую строку).
-n : подтверждает наличие непротиворечивой строки ненулевой длины.
= : осуществляет посимвольное сравнение двух строк на идентичность.
-eq : проводит арифметическую проверку равенства двух целых чисел.
-ne : вычисляет арифметическое неравенство пары числовых аргументов.

Определение расположения утилиты через which

Чтобы глубже понять приоритет вызова в текущей сессии оболочки, вызовем команду type -a [:
Вывод наглядно иллюстрирует внутреннюю структуру: Bash сначала обрабатывает встроенную реализацию (shell builtin), сохраняя при этом ссылки на внешние исполняемые файлы /usr/bin/[ и /bin/[.

Анализ типа команды с помощью type -a

Убедимся в свойствах целевого файла с помощью детального листинга ls -l /usr/bin/[:
Таблица метаданных показывает стандартный скомпилированный ELF-бинарник с установленными правами на исполнение (-rwxr-xr-x), размещенный непосредственно на дисковом накопителе.

Просмотр атрибутов бинарного файла через ls -l

2. Базовый синтаксис вычислений и анализ переменной $?

Запустим тестовое сравнение двух чисел командой [ 10 -gt 5 ], проверяя условие “больше чем” (-gt):
Обратите внимание: корректное выполнение проверки не порождает сообщений в стандартном потоке вывода (stdout) — результат передается исключительно через код выхода процесса.

Выполнение логического сравнения чисел

Считаем статус выполнения завершенной операции посредством echo $?:
Значение 0 подтверждает, что логическое выражение успешно разрешилось со статусом «истина» (True), что в стандартах POSIX соответствует бессбойному завершению команды.

Проверка успешного кода возврата через echo

Проверим альтернативную ветвь логики инструкцией [ 10 -lt 5 ], оценивая условие «меньше чем» (-lt):
Терминал снова сохраняет молчание, передав результат вычисления во внутренний регистр завершения текущего процесса.

Тестирование заведомо ложного условия

Повторно запросим содержимое специальной переменной командой echo $?:
Появление ненулевого кода возврата однозначно сигнализирует оболочке о том, что проверяемое условие оказалось ложным.

Получение ненулевого статуса завершения

3. Практическая диагностика файловой системы (-f, -d, -s)

Создадим изолированное рабочее окружение во временном каталоге для безопасного тестирования: mkdir -p /tmp/bracket_test && touch /tmp/bracket_test/sample.txt.

Инициализация тестовой директории и пустого файла

Проверим корректность пути и тип объекта конструкцией [ -f /tmp/bracket_test/sample.txt ] && echo "파일이 정상적으로 존재합니다":
Так как предикат подтвердил наличие регулярного файла, условный оператор && запустил выполнение следующей команды и вывел подтверждающую строку.

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

Убедимся, что родительский путь является директорией: [ -d /tmp/bracket_test ] && echo "디렉터리가 맞습니다":
Логический тест завершается успешно, подтверждая статус каталога и инициируя вывод статусного уведомления.

Тестирование целевого пути на каталог

Оценим размер созданного файла флагом -s: [ -s /tmp/bracket_test/sample.txt ] || echo "파일 크기가 0(비어있음)입니다":
Поскольку утилита touch создала объект с нулевым объемом, предикат вернул ошибку, что привело к срабатыванию альтернативной цепочки после оператора ||.

Проверка файла на ненулевой размер с оператором ИЛИ

4. Построение условий в скриптах: интеграция с if и короткое замыкание

Наполним тестовый файл полезными данными перед проверкой логических ветвлений: echo "Ubuntu Shell Test" > /tmp/bracket_test/sample.txt.

Запись строковых данных в файл

Свяжем скобочную команду с классическим управляющим блоком: if [ -s /tmp/bracket_test/sample.txt ]; then echo "내용 확인: $(cat /tmp/bracket_test/sample.txt)"; fi:
Наличие данных внутри файла переводит условие -s в статус истинности, передавая управление телу блока then, где считывается актуальное содержимое документа.

Выполнение конструкции if с проверкой размера файла

Очистим файловую систему от временных данных после завершения экспериментов: rm -rf /tmp/bracket_test.

Удаление временной тестовой директории

Мы подробно рассмотрели техническое устройство команды [ в среде Linux, принципы ее обнаружения в системе и механизм взаимодействия с кодами завершения. Понимание того, что скобка является аргументоориентированной командой, помогает избегать типичных синтаксических ошибок (например, пропущенных пробелов) и писать надежные, отказоустойчивые сценарии автоматизации.