[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-rabota-v-cli-bash-kak-pisat-bash-skripty":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":19,"progress":20,"seo":21},170,"kak-pisat-bash-skripty",4,"rabota-v-cli-bash","Работа в CLI (Bash)","💻","Как писать bash-скрипты?","**Bash-скрипт** — это текстовый файл с последовательностью команд, которые интерпретатор bash выполняет как программу. Скрипты автоматизируют повторяющиеся задачи: сборку, деплой, мониторинг, обработку логов.\n\n### Создание и запуск\n\n```bash\n# Первая строка — shebang (указывает интерпретатор)\n#!\u002Fbin\u002Fbash\n\n# Более переносимый вариант (ищет bash через PATH)\n#!\u002Fusr\u002Fbin\u002Fenv bash\n\n# Сделать скрипт исполняемым и запустить\nchmod +x script.sh\n.\u002Fscript.sh\n\n# Или запустить через интерпретатор (chmod не нужен)\nbash script.sh\n```\n\n### Переменные\n\n```bash\n#!\u002Fbin\u002Fbash\nname=\"World\"                     # Без пробелов вокруг '='!\necho \"Hello, $name!\"\necho \"Hello, ${name}!\"          # Фигурные скобки для явности\n\n# Результат команды в переменную\ncurrent_date=$(date +%Y-%m-%d)\nfiles_count=$(ls | wc -l)\n\n# Аргументы скрипта\necho \"Script name: $0\"\necho \"First argument: $1\"\necho \"Second argument: $2\"\necho \"All arguments: $@\"\necho \"Number of arguments: $#\"\n\n# Чтение ввода от пользователя\nread -p \"Enter your name: \" username\necho \"Hello, $username!\"\n```\n\n### Условия (if\u002Felif\u002Felse)\n\n```bash\n#!\u002Fbin\u002Fbash\nif [ -f \"pom.xml\" ]; then\n    echo \"Maven project detected\"\nelif [ -f \"build.gradle\" ]; then\n    echo \"Gradle project detected\"\nelse\n    echo \"Unknown project type\"\nfi\n\n# Проверка аргументов\nif [ $# -eq 0 ]; then\n    echo \"Usage: $0 \u003Cenvironment>\"\n    exit 1\nfi\n```\n\n### Циклы\n\n\u003Cdetails>\n\u003Csummary>Примеры циклов for, while, чтение файла\u003C\u002Fsummary>\n\n```bash\n#!\u002Fbin\u002Fbash\n# Цикл for\nfor file in *.java; do\n    echo \"Processing: $file\"\ndone\n\n# For с диапазоном\nfor i in {1..10}; do\n    echo \"Iteration $i\"\ndone\n\n# C-style for\nfor ((i=0; i\u003C5; i++)); do\n    echo \"$i\"\ndone\n\n# While\ncount=0\nwhile [ $count -lt 5 ]; do\n    echo \"Count: $count\"\n    ((count++))\ndone\n\n# Чтение файла построчно\nwhile IFS= read -r line; do\n    echo \"Line: $line\"\ndone \u003C file.txt\n```\n\n\u003C\u002Fdetails>\n\n### Функции\n\n```bash\n#!\u002Fbin\u002Fbash\nbuild_project() {\n    local project_dir=\"$1\"           # local — локальная переменная\n    local profile=\"${2:-dev}\"        # Значение по умолчанию — \"dev\"\n\n    echo \"Building $project_dir with profile $profile...\"\n    cd \"$project_dir\" || return 1\n    mvn clean package -P\"$profile\"\n    return $?                        # Вернуть код возврата mvn\n}\n\n# Вызов функции\nbuild_project \"\u002Fopt\u002Fmyapp\" \"production\"\nif [ $? -eq 0 ]; then\n    echo \"Build successful!\"\nelse\n    echo \"Build failed!\"\nfi\n```\n\n### Полный пример — скрипт деплоя\n\n\u003Cdetails>\n\u003Csummary>deploy.sh — скрипт сборки и деплоя\u003C\u002Fsummary>\n\n```bash\n#!\u002Fbin\u002Fbash\nset -euo pipefail   # Строгий режим: ошибки, неопределённые переменные, пайпы\n\nAPP_NAME=\"myapp\"\nJAR_FILE=\"target\u002F${APP_NAME}.jar\"\nREMOTE_HOST=\"production\"\nREMOTE_DIR=\"\u002Fopt\u002F${APP_NAME}\"\n\nlog() {\n    echo \"[$(date '+%Y-%m-%d %H:%M:%S')] $1\"\n}\n\nlog \"Building project...\"\nmvn clean package -DskipTests || { log \"Build failed!\"; exit 1; }\n\nlog \"Deploying to ${REMOTE_HOST}...\"\nrsync -avz \"$JAR_FILE\" \"${REMOTE_HOST}:${REMOTE_DIR}\u002F\"\n\nlog \"Restarting application...\"\nssh \"$REMOTE_HOST\" \"sudo systemctl restart ${APP_NAME}\"\n\nlog \"Deployment complete!\"\n```\n\n\u003C\u002Fdetails>\n\n### Вывод\n\nМинимальный набор для продуктивного скриптинга: shebang, `set -euo pipefail`, переменные, условия, циклы, функции с `local`. Всё остальное — комбинация этих элементов.\n\n> **На собеседовании:** обязательно упомяните `set -euo pipefail` как первую строку после shebang — это показывает зрелый подход к скриптингу. Объясните, зачем нужен каждый флаг: `-e` останавливает при ошибке, `-u` ловит опечатки в именах переменных, `-o pipefail` не маскирует ошибки в пайпах.\n\n---","","junior",[15,16,17,18],"scripting","linux","автоматизация","bash",[],null,{"title":22,"description":23,"ogTitle":22,"ogDescription":24,"keywords":25,"schemaAnswer":33,"featuredSnippetReady":34},"Bash-скрипты: переменные, циклы, функции, примеры -- Gymterview","Как писать bash-скрипты? Shebang, переменные, аргументы, условия if\u002Felif\u002Felse, циклы for\u002Fwhile, функции, set -euo pipefail. Полный пример скрипта деплоя.","Полное руководство по написанию bash-скриптов: переменные, циклы, функции, строгий режим и пример скрипта деплоя Java-приложения.",[26,27,28,29,30,31,17,32],"bash скрипт","shebang","переменные bash","циклы bash","функции bash","set -euo pipefail","shell scripting","Bash-скрипт -- текстовый файл с командами, начинающийся с shebang (#!\u002Fbin\u002Fbash или #!\u002Fusr\u002Fbin\u002Fenv bash). Переменные задаются без пробелов вокруг = (name=\"World\"), результат команды -- через $(command). Аргументы доступны через $0 (имя скрипта), $1-$N (аргументы), $@ (все), $# (количество). Условия: if\u002Felif\u002Felse\u002Ffi. Циклы: for (по списку, с диапазоном, C-style) и while. Функции поддерживают локальные переменные (local) и значения по умолчанию (${2:-default}). Рекомендуемый шаблон: set -euo pipefail для строгого режима обработки ошибок.",true]