Подводные камни в Bash №8
Вот те на!
Большинство думает, что [
— это часть команды if
как скобки в других языках программирования. Но нихуя!
В Bash if
просто запускает команду. Команда [ ... ]
— это обычный бинарник, аналогично команде test
, а не специальный синтаксис.
Скобка ]
нужна только для красоты и завершения команды [
.
Команда выше напечатает HELP
, потому что строка "false"
— непустая, а значит, условие считается истинным.
Теперь о главном
Если хочешь использовать grep
в if
, не надо писать скобки!
Плохая практика:
[... ]
— ожидает условие, а не команду
grep
— это команда, а не логическое выражение
Внутри [
запускать команды нельзя — это приведёт к ошибке
Хорошая практика:
if
просто запускает grep
Если grep
нашёл совпадение, он вернёт 0
(успех), и выполнится then
И Всё работает как надо, без лишних скобок!
[
— это как калькулятор, а grep
— это поиск. В калькуляторе искать бесполезно!
Выводы
Никогда не пиши if [ grep ... ]
— это ошибка!
Пиши просто if grep ...
, чтобы проверить результат команды.
if
работает с командами. [
— это тоже команда, но не синтаксис.