В чем разница между [ ] и [[ ]] в Bash?

«В чем разница между [ ] и [[ ]] в Bash?» — вопрос из категории Скриптинг и автоматизация, который задают на 24% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Обе конструкции используются для проверки условий в Bash, но [[ ]] — это более современный и безопасный встроенный оператор оболочки (Bash keyword), тогда как [ ] — это синоним внешней команды test (или встроенной для совместимости).

Ключевые отличия [[ ]]:

  1. Безопасность с переменными: Не требует обязательного заключения переменных в кавычки для защиты от разделения по пробелам или пустых значений.

    filename="file with spaces.txt"
    if [[ -f $filename ]]; then  # Работает корректно
      echo "File exists."
    fi
    # if [ -f $filename ]; then  # Разобьется на несколько аргументов и вызовет ошибку
  2. Расширенные операторы: Поддерживает логические операторы && и || внутри выражения, а также оператор регулярных выражений =~.

    if [[ $var =~ ^error.* && $count -gt 5 ]]; then
      echo "Multiple errors found."
    fi
  3. Сравнение строк: Операторы == и != внутри [[ ]] работают как сопоставление с шаблоном (pattern matching), а не как буквальное сравнение.

    if [[ $hostname == web* ]]; then  # Сравнение с шаблоном 'web*'
      echo "This is a web server."
    fi
  4. Предсказуемость: Является ключевым словом Bash, поэтому не подвержен проблемам, связанным с раскрытием путей (pathname expansion) или разделением слов.

Когда использовать [ ]? В основном для обеспечения переносимости скриптов в оболочки, отличные от Bash (например, dash в Debian/Ubuntu для /bin/sh). Для написания надежных скриптов автоматизации и DevOps-задач на Bash предпочтительнее всегда использовать [[ ]] из-за повышенной безопасности и удобства.