[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-rabota-v-cli-bash-kak-rabotayut-uslovnye-vyrazheniya-v-bash":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":18,"progress":19,"seo":20},171,"kak-rabotayut-uslovnye-vyrazheniya-v-bash",4,"rabota-v-cli-bash","Работа в CLI (Bash)","💻","Как работают условные выражения в bash?","**Условные выражения в bash** — это конструкции для проверки условий (существование файлов, сравнение строк и чисел, логические операции). Bash предоставляет три формы: `test`, `[ ]` (POSIX-совместимые) и `[[ ]]` (расширенная bash-конструкция).\n\n### test и [ ] — POSIX-совместимые конструкции\n\n`test` и `[ ]` — это одно и то же (`[` — это программа, `]` — обязательный последний аргумент):\n\n```bash\ntest -f file.txt       # Эквивалентно:\n[ -f file.txt ]        # Между [ и ] обязательны пробелы!\n```\n\n### [[ ]] — расширенная конструкция bash (рекомендуется)\n\n`[[ ]]` — встроенная конструкция bash, более безопасная и мощная:\n\n```bash\n[[ -f file.txt ]]      # Безопасна при пустых переменных, поддерживает glob и regex\n```\n\n### Проверки файлов\n\n```bash\n[[ -f file.txt ]]      # Файл существует и является обычным файлом\n[[ -d directory ]]     # Существует и является директорией\n[[ -e path ]]          # Существует (любой тип)\n[[ -r file.txt ]]      # Файл доступен для чтения\n[[ -w file.txt ]]      # Файл доступен для записи\n[[ -x script.sh ]]     # Файл исполняемый\n[[ -s file.txt ]]      # Файл существует и не пуст\n[[ -L link ]]          # Является символической ссылкой\n[[ file1 -nt file2 ]]  # file1 новее file2 (newer than)\n[[ file1 -ot file2 ]]  # file1 старше file2 (older than)\n```\n\n### Сравнение строк\n\n```bash\n[[ \"$str1\" == \"$str2\" ]]    # Строки равны\n[[ \"$str1\" != \"$str2\" ]]    # Строки не равны\n[[ \"$str1\" \u003C \"$str2\" ]]     # Лексикографически меньше\n[[ -z \"$str\" ]]             # Строка пуста (zero length)\n[[ -n \"$str\" ]]             # Строка не пуста (non-zero length)\n[[ \"$str\" == *.java ]]      # Glob-паттерн (только в [[ ]])\n[[ \"$str\" =~ ^[0-9]+$ ]]   # Регулярное выражение (только в [[ ]])\n```\n\n### Сравнение чисел\n\n```bash\n[[ $a -eq $b ]]    # Равно (equal)\n[[ $a -ne $b ]]    # Не равно (not equal)\n[[ $a -lt $b ]]    # Меньше (less than)\n[[ $a -le $b ]]    # Меньше или равно (less or equal)\n[[ $a -gt $b ]]    # Больше (greater than)\n[[ $a -ge $b ]]    # Больше или равно (greater or equal)\n\n# Арифметическое сравнение (альтернатива — удобнее для чисел)\n(( a == b ))\n(( a > b ))\n(( a \u003C b ))\n```\n\n### Логические операции\n\n```bash\n# В [[ ]] — внутри одной конструкции\n[[ condition1 && condition2 ]]    # И (AND)\n[[ condition1 || condition2 ]]    # ИЛИ (OR)\n[[ ! condition ]]                 # НЕ (NOT)\n\n# В [ ] — через отдельные вызовы (другой синтаксис!)\n[ condition1 ] && [ condition2 ]\n[ condition1 ] || [ condition2 ]\n[ ! condition ]\n```\n\n### Сравнение [ ] и [[ ]]\n\n| Возможность | `[ ]` | `[[ ]]` |\n|---|---|---|\n| POSIX-совместимость | Да | Нет (только bash\u002Fzsh\u002Fksh) |\n| Glob-паттерны (`*.java`) | Нет | Да |\n| Регулярные выражения (`=~`) | Нет | Да |\n| `&&` \u002F `\\|\\|` внутри | Нет | Да |\n| Безопасность при пустых переменных | Требует кавычки | Кавычки необязательны |\n\n### Практический пример\n\n```bash\n#!\u002Fbin\u002Fbash\nENV=\"${1:-dev}\"\n\nif [[ \"$ENV\" =~ ^(dev|staging|production)$ ]]; then\n    echo \"Deploying to $ENV...\"\nelse\n    echo \"Unknown environment: $ENV\"\n    echo \"Usage: $0 [dev|staging|production]\"\n    exit 1\nfi\n\nif [[ -f \"config-${ENV}.yml\" ]]; then\n    echo \"Using config: config-${ENV}.yml\"\nelse\n    echo \"Config not found, using defaults\"\nfi\n```\n\n> **На собеседовании:** рекомендуйте `[[ ]]` как основную конструкцию, объясните преимущества: безопасность при пустых переменных, поддержка glob и regex, `&&`\u002F`||` внутри. Если спрашивают про POSIX-совместимость (скрипты для `sh`, а не `bash`), тогда используйте `[ ]`.\n\n---","","junior",[15,16,17],"scripting","linux","bash",[],null,{"title":21,"description":22,"ogTitle":21,"ogDescription":23,"keywords":24,"schemaAnswer":32,"featuredSnippetReady":33},"Условные выражения в bash: test, [ ] и [[ ]] -- Gymterview","Как работают условные выражения в bash? Конструкции test, [ ] и [[ ]]. Проверки файлов, сравнение строк и чисел, логические операции, glob-паттерны и регулярные выражения.","Разбор условных выражений bash: test, [ ] и [[ ]], проверки файлов, сравнение строк и чисел, логические операции и regex.",[25,26,27,28,29,30,31],"условные выражения bash","test bash","двойные скобки bash","проверка файлов bash","сравнение строк bash","регулярные выражения bash","[[ ]]","Bash предоставляет три способа проверки условий: test и [ ] (POSIX-совместимые, эквивалентны) и [[ ]] (расширенная конструкция bash, рекомендуется). Проверки файлов: -f (файл), -d (директория), -e (существует), -r\u002F-w\u002F-x (доступ), -s (не пуст). Сравнение строк: ==, !=, -z (пуста), -n (не пуста). Числа: -eq, -ne, -lt, -le, -gt, -ge или арифметика (( )). Преимущества [[ ]]: поддержка glob-паттернов (== *.java), регулярных выражений (=~), логических операторов && и || внутри выражения, безопасная работа с пустыми переменными.",true]