Ответ
Обе конструкции используются для проверки условий в Bash, но [[ ]] — это более современный и безопасный встроенный оператор оболочки (Bash keyword), тогда как [ ] — это синоним внешней команды test (или встроенной для совместимости).
Ключевые отличия [[ ]]:
-
Безопасность с переменными: Не требует обязательного заключения переменных в кавычки для защиты от разделения по пробелам или пустых значений.
filename="file with spaces.txt" if [[ -f $filename ]]; then # Работает корректно echo "File exists." fi # if [ -f $filename ]; then # Разобьется на несколько аргументов и вызовет ошибку -
Расширенные операторы: Поддерживает логические операторы
&&и||внутри выражения, а также оператор регулярных выражений=~.if [[ $var =~ ^error.* && $count -gt 5 ]]; then echo "Multiple errors found." fi -
Сравнение строк: Операторы
==и!=внутри[[ ]]работают как сопоставление с шаблоном (pattern matching), а не как буквальное сравнение.if [[ $hostname == web* ]]; then # Сравнение с шаблоном 'web*' echo "This is a web server." fi -
Предсказуемость: Является ключевым словом Bash, поэтому не подвержен проблемам, связанным с раскрытием путей (pathname expansion) или разделением слов.
Когда использовать [ ]? В основном для обеспечения переносимости скриптов в оболочки, отличные от Bash (например, dash в Debian/Ubuntu для /bin/sh). Для написания надежных скриптов автоматизации и DevOps-задач на Bash предпочтительнее всегда использовать [[ ]] из-за повышенной безопасности и удобства.