[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"/ru/kb/how-to/other/osnovy-bash-v-linuxKbData":3},{"page":4,"pages":247,"recommendedPages":248,"category":106,"categoryTree":106,"total":16,"currentOrder":276,"activeManualCategoryId":106,"tag":-1},{"route":5,"uuid":8,"title":9,"excerpt":10,"content":11,"view_count":12,"published_at":13,"modified_at":14,"like":15,"category":18,"hero_image":99,"seo_metadata":100,"schema_org_metadata":104,"open_graph_metadata":107,"sections":108,"tags":234,"breadcrumbs":235,"images":242},{"language":6,"path":7},"ru","/kb/how-to/other/osnovy-bash-v-linux","626d4318-1ceb-07b7-728f-d9ea317793b9","Основы bash в ОС Linux: создание скриптов, команды, ошибки","Практически любая рутинная задача на Linux-сервере – резервное копирование, работа с логами, перезапуск сервисов, обработка файлов – может выполняться автоматически. Инструмент, который это позволяет, называется Bash-скрипт.","\n\u003Cp>Практически любая рутинная задача на Linux-сервере – резервное копирование, работа с логами, перезапуск сервисов, обработка файлов – может выполняться автоматически. Инструмент, который это позволяет, называется \u003Cstrong>Bash-скрипт\u003C/strong>. Это обычный текстовый файл со списком команд, которые система выполняет одну за другой.\u003C/p>\n\n\n\n\u003Cp>В этой статье разберем основы Bash: что это за оболочка, как устроен синтаксис скриптов, как работать с переменными, условиями, циклами и функциями, а также как запускать скрипты на сервере. Все примеры можно повторить на любом Linux-сервере с доступом по SSH – например, на \u003Ca href=\"https://beget.com/ru/vps?utm_source=kb&amp;utm_medium=article&amp;utm_campaign=bash_linux&amp;utm_content=site_vps\">VPS от Beget\u003C/a>.\u003C/p>\n\n\n\n\u003Ch2 id=\"chto-takoe-bash\">Что такое Bash\u003C/h2>\n\n\n\n\u003Cp>\u003Cstrong>Bash\u003C/strong> (\u003Cstrong>B\u003C/strong>ourne \u003Cstrong>A\u003C/strong>gain \u003Cstrong>Sh\u003C/strong>ell) – это командная оболочка (shell), то есть программа-посредник между пользователем и ядром операционной системы. Вы вводите текстовую команду, Bash ее разбирает, запускает нужную программу и показывает результат.\u003C/p>\n\n\n\n\u003Cp>Bash появился в 1989 году как развитие более старой оболочки \u003Cstrong>sh\u003C/strong> (Bourne Shell) и с тех пор он установлен по умолчанию в большинстве дистрибутивов Linux: Ubuntu, Debian, CentOS, AlmaLinux и других. Когда вы подключаетесь к серверу по SSH и видите приглашение вида \u003Ccode>user@server:~$\u003C/code>, это именно командная оболочка Bash.\u003C/p>\n\n\n\n\u003Cp>Оболочка работает в двух режимах:\u003C/p>\n\n\n\n\u003Cul>\u003Cli>интерактивный – вы вводите команды вручную по одной и сразу видите результат;\u003C/li>\u003Cli>скриптовый – команды заранее записаны в файл, оболочка выполняет их последовательно без вашего участия.\u003C/li>\u003C/ul>\n\n\n\n\u003Cp>Второй режим и есть то, ради чего пишут скрипты: один раз описать последовательность действий и выполнять ее сколько угодно раз.\u003C/p>\n\n\n\n\u003Cp>Проверить, какая оболочка используется у вас, можно командой:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;null&quot;}\">\u003Ccode>echo $0\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>А узнать версию Bash – так:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>bash --version\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Ch2 id=\"chem-bash-otlichaetsya-ot-sh-zsh-i-drugih-obolochek\">Чем Bash отличается от sh, zsh и других оболочек\u003C/h2>\n\n\n\n\u003Cp>В Linux существует несколько оболочек, и путаница между ними – источник трудноуловимых ошибок в скриптах. Разберем самые популярные:&nbsp;\u003C/p>\n\n\n\n\u003Cul>\u003Cli>\u003Ccode>sh\u003C/code> – минималистичная POSIX-оболочка. Скрипты максимально переносимы, но многих удобных возможностей нет. В \u003Ca href=\"https://beget.com/ru/cloud/marketplace/debian-12?utm_source=kb&amp;utm_medium=article&amp;utm_campaign=bash_linux&amp;utm_content=marketplace_debian_12\">Debian\u003C/a> и \u003Ca href=\"https://beget.com/ru/cloud/marketplace/ubuntu-24-04?utm_source=kb&amp;utm_medium=article&amp;utm_campaign=bash_linux&amp;utm_content=marketplace_ubuntu_24_04\">Ubuntu\u003C/a> \u003Ccode>/bin/sh\u003C/code> – это симлинк на \u003Ccode>dash\u003C/code>, а не на \u003Ccode>bash\u003C/code>;\u003C/li>\u003Cli>\u003Ccode>bash\u003C/code> – в основном совместим с POSIX-sh, но добавляет много собственных возможностей. Скрипты, написанные с учетом этого стандарта, будут исполняться без изменений в любых системах, поддерживающих POSIX;\u003C/li>\u003Cli>\u003Ccode>zsh\u003C/code> – мощная и гибкая оболочка, поддерживающая темы и плагины. Используется по умолчанию в macOS. Полной POSIX-совместимости у \u003Ccode>zsh\u003C/code> нет, хотя большинство Bash-скриптов выполняются без изменений. При необходимости \u003Ccode>zsh\u003C/code> может запускаться в режиме \u003Ccode>sh\u003C/code>, а синтаксис во многом пересекается с \u003Ccode>bash\u003C/code>;\u003C/li>\u003Cli>\u003Ccode>fish\u003C/code> – в отличие от \u003Ccode>bash\u003C/code> и \u003Ccode>zsh\u003C/code>, изначально создавалась как оболочка, ориентированная на удобство, но не совместимая с POSIX. Поэтому скрипты, написанные для \u003Ccode>bash\u003C/code> или \u003Ccode>zsh\u003C/code>, как правило, не будут исполняться, их нужно адаптировать под \u003Ccode>fish\u003C/code>.\u003C/li>\u003C/ul>\n\n\n\n\u003Cdiv class=\"wp-block-beget-alert alert-block alert-block-info\">\u003Cdiv class=\"alert-block-title\">Обратите внимание!\u003C/div>\u003Cdiv class=\"alert-block-content\">Если в первой строке скрипта указан \u003Ccode>#!/bin/bash\u003C/code>, запускайте его командой \u003Ccode>bash\u003C/code> \u003Ccode>script.sh\u003C/code> или \u003Ccode>./script.sh\u003C/code>, но не \u003Ccode>sh script.sh\u003C/code> – во втором случае скрипт выполнит другая оболочка, что может повлечь ошибки.\u003C/div>\u003C/div>\n\n\n\n\u003Ch2 id=\"dlya-chego-ispolzuyut-bash-skripty\">Для чего используют Bash-скрипты\u003C/h2>\n\n\n\n\u003Cp>Bash-скрипты применяют везде, где нужна автоматизация на уровне операционной системы:\u003C/p>\n\n\n\n\u003Cul>\u003Cli>\u003Cstrong>резервное копирование\u003C/strong>. Скрипт архивирует каталог с сайтом и дамп базы данных, складывает архив в отдельную папку и удаляет копии старше 30 дней;\u003C/li>\u003Cli>\u003Cstrong>обслуживание сервера\u003C/strong>. Очистка временных файлов и логов, ротация архивов, контроль свободного места на диске;\u003C/li>\u003Cli>\u003Cstrong>мониторинг\u003C/strong>. Проверка доступности сайта, состояния служб, нагрузки на CPU и память с отправкой уведомления при отклонении от нормы;\u003C/li>\u003Cli>\u003Cstrong>развертывание проектов\u003C/strong>. Установка зависимостей, сборка приложения, миграции базы данных, перезапуск сервисов – все одной командой;\u003C/li>\u003Cli>\u003Cstrong>массовая обработка файлов\u003C/strong>. Переименование, конвертация, поиск и замена текста в сотнях файлов;\u003C/li>\u003Cli>\u003Cstrong>настройка окружения\u003C/strong>. Файлы \u003Ccode>.bashrc\u003C/code> и \u003Ccode>.bash_profile\u003C/code> позволяют задать переменные окружения, псевдонимы (алиасы) и вид приглашения командной строки;\u003C/li>\u003Cli>\u003Cstrong>связывание утилит через конвейеры\u003C/strong>. \u003Ccode>bash\u003C/code> передает вывод одной программы на вход другой, что позволяет собирать сложные обработки данных из простых команд.\u003C/li>\u003C/ul>\n\n\n\n\u003Ch2 id=\"osnovnye-komandy-bash\">Основные команды Bash\u003C/h2>\n\n\n\n\u003Cdiv class=\"wp-block-beget-image image-block\">\u003Cimg src=\"https://cp.beget.com/shared/EiWfFWOl_ChB6iLWY7WPZ23xPBuc34F-/linux-table-1.png\" alt=\"Основные команды Bash\">\u003C/div>\n\n\n\n\u003Cdiv class=\"wp-block-beget-image image-block\">\u003Cimg src=\"https://cp.beget.com/shared/AerBVfHWAs-uNdekxfhkQT-mGKqNtFYy/linux-table-2.png\" alt=\"Основные команды Bash\">\u003C/div>\n\n\n\n\u003Ch2 id=\"sintaksis-bash-skriptov\">Синтаксис Bash-скриптов\u003C/h2>\n\n\n\n\u003Cp>Bash-скрипт – это обычный текстовый файл. Создать его можно в любом редакторе:\u003C/p>\n\n\n\n\u003Cul>\u003Cli>\u003Ccode>nano\u003C/code> – самый простой вариант для новичка: подсказки по горячим клавишам всегда внизу экрана, сохранение сочетанием клавиш \u003Ccode>Ctrl+O\u003C/code> и выход по \u003Ccode>Ctrl+X\u003C/code>;\u003C/li>\u003Cli>\u003Ccode>vim\u003C/code> – мощный редактор с модальным управлением, подсветкой синтаксиса и макросами, но требует времени на освоение.\u003C/li>\u003C/ul>\n\n\n\n\u003Cp>Расширение \u003Ccode>.sh\u003C/code> для скриптов не обязательно, но общепринято – оно помогает быстро понять назначение файла.\u003C/p>\n\n\n\n\u003Ch3 id=\"shebang\">Шебанг\u003C/h3>\n\n\n\n\u003Cp>Первая строка скрипта называется \u003Cstrong>шебанг\u003C/strong> (shebang) и указывает системе, какой интерпретатор использовать. Она начинается с символов \u003Ccode>#!\u003C/code>, за которыми следует путь к интерпретатору:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;null&quot;}\">\u003Ccode>#!/bin/bash\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Также можно явно указать путь к интерпретатору. Может быть полезна, если на разных системах \u003Ccode>bash\u003C/code> лежит в разных каталогах:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>#!/usr/bin/env bash\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Ch3 id=\"kommentarii\">Комментарии\u003C/h3>\n\n\n\n\u003Cp>Всё, что идет после символа \u003Ccode>#\u003C/code> (кроме шебанга), интерпретатор игнорирует. Комментарии описывают логику скрипта и не влияют на выполнение:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>#!/bin/bash\n# Этот скрипт выводит приветствие\necho \"Привет!\"   # комментарий можно писать и в конце строки\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Ch3 id=\"kavychki\">Кавычки\u003C/h3>\n\n\n\n\u003Cp>Кавычки – то место, где чаще всего можно допустить ошибку:\u003C/p>\n\n\n\n\u003Cul>\u003Cli>\u003Ccode>\"текст $var\"\u003C/code> – двойные кавычки: переменные и команды подставляются;\u003C/li>\u003Cli>\u003Ccode>'текст $var'\u003C/code> – одинарные кавычки: всё воспринимается буквально, подстановки нет;\u003C/li>\u003Cli>\u003Ccode>`команда`\u003C/code> или \u003Ccode>`$(команда)`\u003C/code> – подстановка результата выполнения команды.\u003C/li>\u003C/ul>\n\n\n\n\u003Cp>Пример:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>#!/bin/bash\nname=\"Beget\"\necho \"Привет, $name\"      # Привет, Beget\necho 'Привет, $name'      # Привет, $name\necho \"Дата: $(date +%F)\"  # Дата: 2026-07-24\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cdiv class=\"wp-block-beget-alert alert-block alert-block-info\">\u003Cdiv class=\"alert-block-title\">Обратите внимание!\u003C/div>\u003Cdiv class=\"alert-block-content\">Всегда заключайте переменные в двойные кавычки – \u003Ccode>\"$file\"\u003C/code>, а не \u003Ccode>`$file`\u003C/code> – иначе имя файла с пробелом \u003Ccode>bash\u003C/code> разделит на несколько аргументов, и скрипт сработает не так, как задумано.\u003C/div>\u003C/div>\n\n\n\n\u003Ch2 id=\"kak-sozdat-i-zapustit-bash-skript\">Как создать и запустить Bash-скрипт\u003C/h2>\n\n\n\n\u003Col>\u003Cli>В первую очередь необходимо создать файл:&nbsp;\u003C/li>\u003C/ol>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>touch hello.sh\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Col start=\"2\">\u003Cli>Откройте файл любым текстовым редактором, впишите код и сохраните файл:\u003C/li>\u003C/ol>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>#!/bin/bash\necho \"Hello, World!\"\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Col start=\"3\">\u003Cli>Сделайте файл исполняемым. По умолчанию новый файл не имеет права на выполнение. Его нужно выдать командой \u003Ccode>chmod\u003C/code>:\u003C/li>\u003C/ol>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>chmod +x hello.sh\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Общий синтаксис команды:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>chmod [опции] права файл\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Права можно задавать двумя способами:&nbsp;\u003C/p>\n\n\n\n\u003Cul>\u003Cli>символьным (\u003Ccode>+x\u003C/code>, \u003Ccode>u+rw\u003C/code>)&nbsp;\u003C/li>\u003Cli>числовым (\u003Ccode>700\u003C/code>, \u003Ccode>644\u003C/code>)\u003C/li>\u003C/ul>\n\n\n\n\u003Cp>Несколько примеров:&nbsp;\u003C/p>\n\n\n\n\u003Cul>\u003Cli>\u003Ccode>755\u003C/code> – \u003Ccode>rwxr-xr-x\u003C/code> – владелец может всё, остальные – читать и выполнять\u003C/li>\u003Cli>\u003Ccode>700\u003C/code> – \u003Ccode>rwx------\u003C/code> – доступ только владельцу\u003C/li>\u003Cli>\u003Ccode>644\u003C/code> – \u003Ccode>rw-r--r--\u003C/code> – обычный файл без права на выполнение\u003C/li>\u003C/ul>\n\n\n\n\u003Col start=\"4\">\u003Cli>Запуск скрипта. Есть три способа:\u003C/li>\u003C/ol>\n\n\n\n\u003Cul>\u003Cli>\u003Ccode>./hello.sh\u003C/code> – запуск как программы, нужен бит выполнения и шебанг\u003C/li>\u003Cli>\u003Ccode>bash hello.sh\u003C/code> – явный запуск через интерпретатор, бит выполнения не нужен\u003C/li>\u003Cli>\u003Ccode>source hello.sh\u003C/code> – выполнение в текущей оболочке (или короткая форма: \u003Ccode>. hello.sh\u003C/code>)\u003C/li>\u003C/ul>\n\n\n\n\u003Cp>При запуске с помощью \u003Ccode>source\u003C/code> скрипт выполняется не в отдельном процессе, а в текущей сессии, поэтому заданные в нем переменные останутся доступны после завершения. Именно так подключают файлы конфигурации.\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-alert alert-block alert-block-info\">\u003Cdiv class=\"alert-block-title\">Обратите внимание!\u003C/div>\u003Cdiv class=\"alert-block-content\">В первом варианте без \u003Ccode>./ bash\u003C/code> будет искать \u003Ccode>hello.sh\u003C/code> только в каталогах из переменной \u003Ccode>PATH\u003C/code> и выдаст ошибку \u003Ccode>command not found\u003C/code>.\u003C/div>\u003C/div>\n\n\n\n\u003Ch2 id=\"peremennye\">Переменные\u003C/h2>\n\n\n\n\u003Cp>Переменные хранят данные: строки, числа, результаты выполнения команд.\u003C/p>\n\n\n\n\u003Ch3 id=\"sozdanie-i-ispolzovanie\">Создание и использование\u003C/h3>\n\n\n\n\u003Cp>Переменная создается оператором присваивания \u003Ccode>=\u003C/code>.&nbsp;\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-alert alert-block alert-block-info\">\u003Cdiv class=\"alert-block-title\">Обратите внимание!\u003C/div>\u003Cdiv class=\"alert-block-content\">Пробелы вокруг знака \u003Ccode>=\u003C/code> недопустимы.\u003C/div>\u003C/div>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>#!/bin/bash\nhost=\"beget.com\"     # правильно\n# host = \"beget.com\" # ошибка: command not found\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Чтобы получить значение, перед именем ставится символ \u003Ccode>$\u003C/code>. Форма с фигурными скобками \u003Ccode>${host}\u003C/code> нужна, когда сразу после имени идет другой текст:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>echo \"$host\"\necho \"${host}_backup\"   # без скобок Bash искал бы переменную host_backup\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Ch3 id=\"vvod-dannyh-ot-polzovatelya\">Ввод данных от пользователя\u003C/h3>\n\n\n\n\u003Cp>Команда \u003Ccode>read\u003C/code> считывает строку с клавиатуры и записывает ее в переменную:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>#!/bin/bash\nread -p \"Введите ваше имя: \" username\necho \"Здравствуйте, $username!\"\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Параметр \u003Ccode>-p\u003C/code> выводит приглашение, а \u003Ccode>-s\u003C/code> скрывает ввод – это удобно при запросе пароля.\u003C/p>\n\n\n\n\u003Ch3 id=\"peremennye-okruzheniya\">Переменные окружения\u003C/h3>\n\n\n\n\u003Cp>Часть переменных система задает автоматически. Полный список выводит команда \u003Ccode>env\u003C/code>:\u003C/p>\n\n\n\n\u003Cul>\u003Cli>\u003Ccode>$HOME\u003C/code> – домашний каталог пользователя;\u003C/li>\u003Cli>\u003Ccode>$USER\u003C/code> – имя текущего пользователя;\u003C/li>\u003Cli>\u003Ccode>$PWD\u003C/code> – текущий рабочий каталог;\u003C/li>\u003Cli>\u003Ccode>$PATH\u003C/code> – список каталогов, где ищутся исполняемые файлы;\u003C/li>\u003Cli>\u003Ccode>$SHELL\u003C/code> – путь к текущей оболочке;\u003C/li>\u003Cli>\u003Ccode>$HOSTNAME\u003C/code> – имя хоста.\u003C/li>\u003C/ul>\n\n\n\n\u003Cp>Чтобы переменная стала доступна дочерним процессам, ее экспортируют:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>export API_KEY=\"secret\"\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Ch3 id=\"arifmetika\">Арифметика\u003C/h3>\n\n\n\n\u003Cp>Bash по умолчанию работает со строками, поэтому арифметику заключают в двойные круглые скобки:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>#!/bin/bash\na=10\nb=3\necho $(( a + b ))   # 13\necho $(( a * b ))   # 30\necho $(( a / b ))   # 3 - целочисленное деление\necho $(( a % b ))   # 1 - остаток\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Для дробных чисел встроенных средств нет, используется утилита \u003Ccode>bc\u003C/code>:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>echo \"scale=2; 10 / 3\" | bc   # 3.33\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Ch2 id=\"parametry-komandnoy-stroki\">Параметры командной строки\u003C/h2>\n\n\n\n\u003Cp>Скрипту можно передавать аргументы при запуске – внутри они доступны через позиционные переменные \u003Ccode>$1\u003C/code>, \u003Ccode>$2\u003C/code>, \u003Ccode>$3\u003C/code> и так далее.\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>#!/bin/bash\necho \"Привет, $1! Тебе $2 лет.\"\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Запуск:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>./greet.sh Иван 30\n# Привет, Иван! Тебе 30 лет.\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Помимо позиционных, есть специальные переменные:\u003C/p>\n\n\n\n\u003Cul>\u003Cli>\u003Ccode>$0\u003C/code> – имя самого скрипта;\u003C/li>\u003Cli>\u003Ccode>$#\u003C/code> – количество переданных аргументов;\u003C/li>\u003Cli>\u003Ccode>$@\u003C/code> – все аргументы как отдельные элементы (используйте \u003Ccode>\"$@\"\u003C/code>);\u003C/li>\u003Cli>\u003Ccode>$*\u003C/code> – все аргументы одной строкой;\u003C/li>\u003Cli>\u003Ccode>$?\u003C/code> – код возврата последней команды: \u003Ccode>0\u003C/code> – успех, любое другое число – ошибка;\u003C/li>\u003Cli>\u003Ccode>$$\u003C/code> – PID текущего процесса.\u003C/li>\u003C/ul>\n\n\n\n\u003Ch2 id=\"uslovnye-operatory\">Условные операторы\u003C/h2>\n\n\n\n\u003Cp>Условия позволяют скрипту принимать решения.\u003C/p>\n\n\n\n\u003Ch3 id=\"konstrukciya-if\">Конструкция if\u003C/h3>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>if [ условие ]; then\n    команды\nelif [ другое_условие ]; then\n    команды\nelse\n    команды\nfi\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Обратите внимание на пробелы внутри квадратных скобок – \u003Ccode>[ $a -eq $b ]\u003C/code>. Без них \u003Ccode>bash\u003C/code> выдаст ошибку, потому что \u003Ccode>[\u003C/code> – это не синтаксический элемент, а самостоятельная команда.\u003C/p>\n\n\n\n\u003Ch3 id=\"sravnenie-chisel\">Сравнение чисел\u003C/h3>\n\n\n\n\u003Cul>\u003Cli>\u003Ccode>-eq\u003C/code> – равно;\u003C/li>\u003Cli>\u003Ccode>-ne\u003C/code> – не равно;\u003C/li>\u003Cli>\u003Ccode>-gt\u003C/code> – больше;\u003C/li>\u003Cli>\u003Ccode>-ge\u003C/code> – больше или равно;\u003C/li>\u003Cli>\u003Ccode>-lt\u003C/code> – меньше;\u003C/li>\u003Cli>\u003Ccode>-le\u003C/code> – меньше или равно.\u003C/li>\u003C/ul>\n\n\n\n\u003Ch3 id=\"sravnenie-strok\">Сравнение строк\u003C/h3>\n\n\n\n\u003Cul>\u003Cli>\u003Ccode>=\u003C/code> или \u003Ccode>==\u003C/code> – строки равны;\u003C/li>\u003Cli>\u003Ccode>!=\u003C/code> – строки не равны;\u003C/li>\u003Cli>\u003Ccode>-z\u003C/code> – строка пустая;\u003C/li>\u003Cli>\u003Ccode>-n\u003C/code> – строка не пустая.\u003C/li>\u003C/ul>\n\n\n\n\u003Ch3 id=\"proverka-faylov\">Проверка файлов\u003C/h3>\n\n\n\n\u003Cul>\u003Cli>\u003Ccode>-e\u003C/code> – файл или каталог существует;\u003C/li>\u003Cli>\u003Ccode>-f\u003C/code> – существует и является обычным файлом;\u003C/li>\u003Cli>\u003Ccode>-d\u003C/code> – существует и является каталогом;\u003C/li>\u003Cli>\u003Ccode>-r\u003C/code> / \u003Ccode>-w\u003C/code> / \u003Ccode>-x\u003C/code> – доступен для чтения / записи / выполнения;\u003C/li>\u003Cli>\u003Ccode>-s\u003C/code> – существует и не пустой.\u003C/li>\u003C/ul>\n\n\n\n\u003Cp>Пример:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>#!/bin/bash\nfile=\"/var/log/nginx/error.log\"\nif [ -f \"$file\" ]; then\n    echo \"Файл найден, размер: $(du -h \"$file\" | cut -f1)\"\nelse\n    echo \"Файл $file не найден\"\n    exit 1\nfi\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Ch3 id=\"logicheskie-operatory\">Логические операторы\u003C/h3>\n\n\n\n\u003Cp>Условия комбинируются через \u003Ccode>&amp;&amp;\u003C/code> (И), \u003Ccode>||\u003C/code> (ИЛИ) и \u003Ccode>!\u003C/code> (отрицание):\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>#!/bin/bash\nage=25\nif [ \"$age\" -ge 18 ] &amp;&amp; [ \"$age\" -lt 65 ]; then\n    echo \"Возраст в рабочем диапазоне\"\nfi\nif [ ! -d \"/backup\" ]; then\n    mkdir -p /backup\nfi\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>В Bash вместо одинарных скобок удобнее использовать двойные \u003Ccode>[[ ]]\u003C/code>: они безопаснее при работе с переменными, поддерживают шаблоны и логику \u003Ccode>&amp;&amp;\u003C/code>/\u003Ccode>||\u003C/code> внутри скобок:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>if [[ \"$filename\" == *.txt &amp;&amp; -f \"$filename\" ]]; then\n    echo \"Это текстовый файл\"\nfi\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Ch3 id=\"konstrukciya-case\">Конструкция case\u003C/h3>\n\n\n\n\u003Cp>Когда вариантов много, \u003Ccode>case\u003C/code> читается лучше длинной цепочки \u003Ccode>elif\u003C/code>:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>#!/bin/bash\ncase \"$1\" in\n    start)\n        echo \"Запуск сервиса\"\n        ;;\n    stop)\n        echo \"Остановка сервиса\"\n        ;;\n    restart)\n        echo \"Перезапуск сервиса\"\n        ;;\n    *)\n        echo \"Использование: $0 {start|stop|restart}\"\n        exit 1\n        ;;\nesac\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Ch2 id=\"cikly\">Циклы\u003C/h2>\n\n\n\n\u003Cp>Циклы выполняют один и тот же блок команд многократно.\u003C/p>\n\n\n\n\u003Ch3 id=\"cikl-for\">Цикл for\u003C/h3>\n\n\n\n\u003Cp>Перебирает элементы списка:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>#!/bin/bash\nfor number in 1 2 3 4 5; do\n    echo \"Итерация $number\"\ndone\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Диапазон удобнее записывать через фигурные скобки:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>for i in {1..10}; do\n    echo \"$i\"\ndone\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Перебор файлов в каталоге – одна из самых частых задач:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>#!/bin/bash\n\nfor file in /var/log/*.log; do\n    echo \"Обрабатываю: $file\"\n    gzip \"$file\"\ndone\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Ch3 id=\"cikl-while\">Цикл while\u003C/h3>\n\n\n\n\u003Cp>Выполняется, пока условие остается истинным:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>#!/bin/bash\ncounter=1\nwhile [ \"$counter\" -le 5 ]; do\n    echo \"Счетчик: $counter\"\n    counter=$(( counter + 1 ))\ndone\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Типичный прием – построчное чтение файла:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>#!/bin/bash\nwhile read -r line; do\n    echo \"Строка: $line\"\ndone &lt; /etc/hosts\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Ch3 id=\"cikl-until\">Цикл until\u003C/h3>\n\n\n\n\u003Cp>Противоположность \u003Ccode>while\u003C/code> – выполняется, пока условие ложно, и останавливается, когда оно станет истинным.\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>#!/bin/bash\ncount=1\nuntil [ \"$count\" -gt 3 ]; do\n    echo \"Попытка $count\"\n    count=$(( count + 1 ))\ndone\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Ch3 id=\"break-i-continue\">break и continue\u003C/h3>\n\n\n\n\u003Cp>\u003Ccode>break\u003C/code> досрочно выходит из цикла, \u003Ccode>continue\u003C/code> пропускает текущую итерацию:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>#!/bin/bash\nfor i in {1..10}; do\n    if [ \"$i\" -eq 5 ]; then\n        continue    # пропускаем пятерку\n    fi\n    if [ \"$i\" -gt 8 ]; then\n        break       # выходим из цикла\n    fi\n    echo \"$i\"\ndone\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Ch2 id=\"funkcii\">Функции\u003C/h2>\n\n\n\n\u003Cp>Функции группируют команды в именованные блоки, которые можно вызывать многократно. Это избавляет от дублирования кода.\u003C/p>\n\n\n\n\u003Ch3 id=\"obyavlenie\">Объявление\u003C/h3>\n\n\n\n\u003Cp>Два равнозначных варианта:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>my_function() {\n    команды\n}\n# или\nfunction my_function {\n    команды\n}\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Функцию нужно объявить до первого вызова – \u003Ccode>bash\u003C/code> читает скрипт сверху вниз.\u003C/p>\n\n\n\n\u003Ch3 id=\"argumenty\">Аргументы\u003C/h3>\n\n\n\n\u003Cp>Аргументы передаются через пробел после имени функции, без круглых скобок и запятых. Внутри они доступны как \u003Ccode>$1\u003C/code>, \u003Ccode>$2\u003C/code> и так далее:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>#!/bin/bash\ngreet() {\n    echo \"Привет, $1! Тебе $2 лет.\"\n}\n\ngreet \"Анна\" 30\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Ch3 id=\"lokalnye-peremennye-i-vozvrat-znacheniy\">Локальные переменные и возврат значений\u003C/h3>\n\n\n\n\u003Cp>По умолчанию все переменные в \u003Ccode>bash\u003C/code> глобальные. Чтобы переменная существовала только внутри функции, она объявляется с ключевым словом \u003Ccode>local\u003C/code> – это защищает от неожиданной перезаписи данных:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>#!/bin/bash\ncalculate() {\n    local result=$(( $1 + $2 ))\n    echo \"$result\"     # «возврат» значения через вывод\n}\nsum=$(calculate 5 7)\necho \"Сумма: $sum\"     # Сумма: 12\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Оператор \u003Ccode>return\u003C/code> в Bash возвращает \u003Cstrong>код завершения\u003C/strong> (число от 0 до 255), а не значение. Чтобы вернуть данные, их выводят через \u003Ccode>echo\u003C/code> и перехватывают подстановкой \u003Ccode>$( )\u003C/code>:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>#!/bin/bash\ncheck_file() {\n    if [ -f \"$1\" ]; then\n        return 0    # успех\n    else\n        return 1    # ошибка\n    fi\n}\nif check_file \"/etc/passwd\"; then\n    echo \"Файл существует\"\nfi\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Ch2 id=\"massivy\">Массивы\u003C/h2>\n\n\n\n\u003Cp>Массив хранит набор значений под одним именем:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>#!/bin/bash\nservers=(\"web1\" \"web2\" \"db1\")\necho \"${servers[0]}\"      # web1 - нумерация с нуля\necho \"${servers[@]}\"      # все элементы\necho \"${#servers[@]}\"     # количество элементов: 3\nservers+=(\"cache1\")       # добавить элемент\nfor server in \"${servers[@]}\"; do\n    echo \"Проверяю $server\"\ndone\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Ch2 id=\"rabota-s-faylami-i-direktoriyami\">Работа с файлами и директориями\u003C/h2>\n\n\n\n\u003Cp>Проверить существование файла можно командой \u003Ccode>test\u003C/code> или ее краткой формой – квадратными скобками:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>test -e filename\n# то же самое:\n[ -e filename ]\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Команда возвращает \u003Ccode>0\u003C/code>, если файл существует, и ненулевое значение в противном случае. Результат доступен в переменной \u003Ccode>$?\u003C/code>.\u003C/p>\n\n\n\n\u003Cp>Несколько типовых операций:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>#!/bin/bash\n# Создать каталог, если его нет\nmkdir -p /backup/2026\n# Скопировать с сохранением прав и меток времени\ncp -a /var/www/site /backup/site\n# Найти и удалить файлы старше 30 дней\nfind /backup -name \"*.tar.gz\" -mtime +30 -delete\n# Посчитать количество строк в файле\nlines=$(wc -l &lt; /var/log/access.log)\necho \"Строк в логе: $lines\"\n# Создать архив\ntar -czf /backup/site-$(date +%Y-%m-%d).tar.gz /var/www/site\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Ch2 id=\"perenapravlenie-potokov-i-konveyery\">Перенаправление потоков и конвейеры\u003C/h2>\n\n\n\n\u003Cp>У каждой программы в Linux есть три стандартных потока: ввод (\u003Ccode>stdin\u003C/code>, дескриптор \u003Ccode>0\u003C/code>), вывод (\u003Ccode>stdout\u003C/code>, \u003Ccode>1\u003C/code>) и вывод ошибок (\u003Ccode>stderr\u003C/code>, \u003Ccode>2\u003C/code>). Bash позволяет ими управлять:\u003C/p>\n\n\n\n\u003Cul>\u003Cli>\u003Ccode>команда &gt; file\u003C/code> – записать вывод в файл, перезаписав его;\u003C/li>\u003Cli>\u003Ccode>команда &gt;&gt; file\u003C/code> – записать вывод в конец файла;\u003C/li>\u003Cli>\u003Ccode>команда 2&gt; file\u003C/code> – записать в файл только ошибки;\u003C/li>\u003Cli>\u003Ccode>команда &gt; file 2&gt;&amp;1\u003C/code> – записать в файл и вывод, и ошибки;\u003C/li>\u003Cli>\u003Ccode>команда &gt; /dev/null 2&gt;&amp;1\u003C/code> – полностью подавить любой вывод;\u003C/li>\u003Cli>\u003Ccode>команда1 | команда2\u003C/code> – передать вывод первой команды на вход второй.\u003C/li>\u003C/ul>\n\n\n\n\u003Cp>Конвейер (\u003Ccode>pipe\u003C/code>) используются для связи нескольких команд путем перенаправления вывода одной команды (\u003Ccode>stdout\u003C/code>) на вход (\u003Ccode>stdin\u003C/code>) последующей, используя символ конвейера \u003Ccode>|\u003C/code>.\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode># Топ-10 IP-адресов по количеству запросов в логе nginx\ncat /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head -10\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Ch2 id=\"zapusk-skriptov-po-raspisaniyu-cherez-cron\">Запуск скриптов по расписанию через cron\u003C/h2>\n\n\n\n\u003Cp>Для запуска скрипта, который нужно выполнять регулярно, используется планировщик \u003Ccode>cron\u003C/code>:&nbsp;\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>crontab -e\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Синтаксис для добавления задания через терминал:&nbsp; \u003Ccode>минута час день месяц день_недели команда\u003C/code>. Пример:&nbsp;\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode># Каждый день в 03:30 запускать резервное копирование\n30 3 * * * /home/user/scripts/backup.sh &gt;&gt; /home/user/logs/backup.log 2&gt;&amp;1\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>На виртуальном хостинге Beget задания \u003Ccode>cron\u003C/code> удобнее настраивать через раздел \u003Ca href=\"https://cp.beget.com/crontab?utm_source=kb&amp;utm_medium=article&amp;utm_campaign=bash_linux&amp;utm_content=cp_crontab\">CronTab\u003C/a> в панели управления.\u003C/p>\n\n\n\n\u003Ch2 id=\"otladka-skriptov\">Отладка скриптов\u003C/h2>\n\n\n\n\u003Cp>Пошаговый режим показывает каждую команду перед выполнением с подставленными значениями переменных:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>bash -x script.sh\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Внутри скрипта отладку можно включать и выключать для отдельного участка:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>set -x    # включить трассировку\n# проблемный код\nset +x    # выключить\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Еще один прием, который может быть полезен, – “строгий режим” в начале каждого скрипта:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>#!/bin/bash\nset -euo pipefail\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cul>\u003Cli>\u003Ccode>-e\u003C/code> – прервать выполнение при первой же ошибке;\u003C/li>\u003Cli>\u003Ccode>-u\u003C/code> – считать ошибкой обращение к необъявленной переменной;\u003C/li>\u003Cli>\u003Ccode>-o pipefail\u003C/code> – возвращать ошибку, если сбой произошел в любом звене конвейера.\u003C/li>\u003C/ul>\n\n\n\n\u003Cp>Без этих настроек скрипт после неудачной команды продолжит работу как ни в чем не бывало. Например, попытается заархивировать каталог, который не удалось создать.\u003C/p>\n\n\n\n\u003Cp>Для проверки синтаксиса без запуска используйте:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>bash -n script.sh\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>А для полноценного анализа кода – утилиту \u003Ccode>ShellCheck\u003C/code>:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>apt install shellcheck   # Debian/Ubuntu\nshellcheck script.sh\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Ch2 id=\"prakticheskie-primery-skriptov\">Практические примеры скриптов\u003C/h2>\n\n\n\n\u003Ch3 id=\"rezervnoe-kopirovanie-sayta-i-bazy-dannyh\">Резервное копирование сайта и базы данных\u003C/h3>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>#!/bin/bash\n# Количество дней для хранения копий\ndays=14\n# Путь к папке с файлами для хранения файлов копий\nbackup_dir=\"backups\"\n# Имя директории сайта\nsite_dir=\"yoursite.com\"\n# Имя базы данных\ndb_name=\"login_db\"\n# Пароль для доступа к базе данных\ndb_pass=\"Mpo2Dkm\"\nd=`date +%F-%H:%M:%S`\nmkdir -p $backup_dir 2&gt;/dev/null\n# Удаление старых файлов копий\nfind $backup_dir -name \"*autobackup.tar.gz\" -type f -mtime +$days -delete\n# Дамп базы данных\ndump_name=\"$site_dir/dump-$d.sql\"\nmysqldump -h localhost -u$db_name $db_name -p\"$db_pass\" &gt; $dump_name\n# Архивирование файлов\ntar cvvzf \"$backup_dir/$site_dir-$d-autobackup.tar.gz\" $site_dir\nrm $dump_name\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Ch3 id=\"proverka-dostupnosti-sayta\">Проверка доступности сайта\u003C/h3>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>#!/bin/bash\nURL=\"https://example.com\"\ncode=$(curl -o /dev/null -s -w \"%{http_code}\" --max-time 10 \"$URL\")\nif [ \"$code\" -ne 200 ]; then\n    echo \"[$(date)] $URL недоступен, код ответа: $code\" &gt;&gt; /var/log/site-check.log\nelse\n    echo \"[$(date)] $URL работает нормально\"\nfi\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Ch2 id=\"faq\">FAQ\u003C/h2>\n\n\n\n\u003Cdiv class=\"wp-block-beget-collapse collapse-block _has-background\">\u003Cdiv class=\"collapse-block__trigger\">\u003Cdiv>Почему при запуске появляется ошибка \u003Ccode>«Permission denied»\u003C/code>?\u003C/div>\u003C/div>\u003Cdiv class=\"collapse-block__body-wrapper\">\u003Cdiv class=\"collapse-block__body\">\n\u003Cp>У файла нет бита выполнения. Выполните \u003Ccode>chmod +x script.sh\u003C/code>. Если ошибка сохраняется, проверьте, что раздел не смонтирован с опцией \u003Ccode>noexec\u003C/code>.\u003C/p>\n\u003C/div>\u003C/div>\u003C/div>\n\n\n\n\u003Cdiv class=\"wp-block-beget-collapse collapse-block _has-background\">\u003Cdiv class=\"collapse-block__trigger\">\u003Cdiv>В чем разница между \u003Ccode>./script.sh\u003C/code> и \u003Ccode>source script.sh\u003C/code>?\u003C/div>\u003C/div>\u003Cdiv class=\"collapse-block__body-wrapper\">\u003Cdiv class=\"collapse-block__body\">\n\u003Cp>Первый вариант запускает скрипт в отдельном процессе – изменения переменных не сохранятся в вашей сессии. Второй выполняет команды в текущей оболочке, поэтому переменные и функции останутся доступны после завершения.\u003C/p>\n\u003C/div>\u003C/div>\u003C/div>\n\n\n\n\u003Cdiv class=\"wp-block-beget-collapse collapse-block _has-background\">\u003Cdiv class=\"collapse-block__trigger\">\u003Cdiv>Можно ли запускать Bash-скрипты на виртуальном хостинге?\u003C/div>\u003C/div>\u003Cdiv class=\"collapse-block__body-wrapper\">\u003Cdiv class=\"collapse-block__body\">\n\u003Cp>Да, это возможно, но установка пакетов и настройка системных служб доступны на VPS и выделенных серверах, где вы работаете с правами \u003Ccode>root\u003C/code>.\u003C/p>\n\u003C/div>\u003C/div>\u003C/div>\n\n\n\n\u003Cdiv class=\"wp-block-beget-collapse collapse-block _has-background\">\u003Cdiv class=\"collapse-block__trigger\">\u003Cdiv>Чем Bash отличается от Python для автоматизации?\u003C/div>\u003C/div>\u003Cdiv class=\"collapse-block__body-wrapper\">\u003Cdiv class=\"collapse-block__body\">\n\u003Cp>Bash идеален для последовательного вызова системных утилит и работы с файлами: то, что в Python занимает десяток строк с импортами, здесь помещается в одну. Но как только появляются сложные структуры данных, работа с API или объемная логика, читаемость Bash резко падает – тогда стоит переходить на Python.\u003C/p>\n\u003C/div>\u003C/div>\u003C/div>\n\n\n\n\u003Ch2 id=\"zaklyuchenie\">Заключение\u003C/h2>\n\n\n\n\u003Cp>Bash – отличный инструмент для администрирования Linux-сервера, позволяющий автоматизировать резервное копирование, мониторинг и развертывание, а вместе с этим избавиться от рутины.\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-alert alert-block alert-block-info\">\u003Cdiv class=\"alert-block-title\">\u003Cem>Bash помогает превратить рутинные операции с Linux-сервером в автоматизированные сценарии – быстрее, надежнее и с меньшим количеством ручной работы.\u003C/em>\u003C/div>\u003Cdiv class=\"alert-block-content\">\u003Cem>Илья Пилипенко, технический писатель в Beget\u003C/em>\u003C/div>\u003C/div>\n\n\n\n\u003Cp>Если возникнут вопросы, напишите нам, пожалуйста, тикет из панели управления аккаунта (раздел “\u003Ca href=\"https://cp.beget.com/support?utm_source=kb&amp;utm_medium=article&amp;utm_campaign=bash_linux&amp;utm_content=cp_support\">Помощь и поддержка\u003C/a>”), а если вы захотите обсудить наши продукты с коллегами по цеху и сотрудниками Beget – ждем вас в нашем\u003Ca href=\"https://t.me/beget_chat\"> сообществе\u003C/a> в Telegram.\u003C/p>\n",9,"2026-09-10T13:11:04.000Z","2026-09-10T13:38:27.000Z",{"count":16,"liked":17},0,false,{"route":19,"title":21,"tags":22,"breadcrumbs":91,"uuid":92,"parent_uuid":93,"default_page_path":27,"seo_metadata":94},{"language":6,"path":20},"/kb/how-to/other","Другое",[23,28,32,36,40,44,48,52,56,60,64,68,72,75,79,83,87],{"id":24,"title":25,"seo_metadata":26},"ddos","DDoS",{"title":27,"description":27,"header":27,"keywords":27},"",{"id":29,"title":30,"seo_metadata":31},"veb-analitika","Веб-аналитика",{"title":27,"description":27,"header":27,"keywords":27},{"id":33,"title":34,"seo_metadata":35},"reklama","Реклама",{"title":27,"description":27,"header":27,"keywords":27},{"id":37,"title":38,"seo_metadata":39},"php","PHP",{"title":27,"description":27,"header":27,"keywords":27},{"id":41,"title":42,"seo_metadata":43},"redis","Redis",{"title":27,"description":27,"header":27,"keywords":27},{"id":45,"title":46,"seo_metadata":47},"sajty","Сайты",{"title":27,"description":27,"header":27,"keywords":27},{"id":49,"title":50,"seo_metadata":51},"servisy","Сервисы",{"title":27,"description":27,"header":27,"keywords":27},{"id":53,"title":54,"seo_metadata":55},"backup","BackUp",{"title":27,"description":27,"header":27,"keywords":27},{"id":57,"title":58,"seo_metadata":59},"mysql","MySQL",{"title":27,"description":27,"header":27,"keywords":27},{"id":61,"title":62,"seo_metadata":63},"terminal","Терминал",{"title":27,"description":27,"header":27,"keywords":27},{"id":65,"title":66,"seo_metadata":67},"fajlovyj-menedzher","Файловый менеджер",{"title":27,"description":27,"header":27,"keywords":27},{"id":69,"title":70,"seo_metadata":71},"apache","Apache",{"title":27,"description":27,"header":27,"keywords":27},{"id":73,"title":73,"seo_metadata":74},"htaccess",{"title":27,"description":27,"header":27,"keywords":27},{"id":76,"title":77,"seo_metadata":78},"bitrix","Bitrix",{"title":27,"description":27,"header":27,"keywords":27},{"id":80,"title":81,"seo_metadata":82},"cms","CMS",{"title":27,"description":27,"header":27,"keywords":27},{"id":84,"title":85,"seo_metadata":86},"ssh","SSH",{"title":27,"description":27,"header":27,"keywords":27},{"id":88,"title":89,"seo_metadata":90},"diagnostika","Диагностика",{"title":27,"description":27,"header":27,"keywords":27},[],"990b6a3c-10fb-f492-f734-6ece33e9e4e3","fa9a1354-631a-4206-df34-291f0db8f42a",{"title":95,"description":96,"header":97,"keywords":98},"Другие вопросы. Полезные статьи – Beget","Полезные статьи о Других вопросах на сайте Beget","Другие вопросы. Полезные статьи","Beget, FAQ",{"src":27,"text":27},{"title":101,"description":102,"keywords":103},"Основы bash в Linux: создание скриптов, базовые команды","Подробный обзор bash в ОС Linux: создание скриптов для автоматизации задач, руководство по базовым командам, популярные ошибки","как пользоваться bash в Linux, гайд по работе с оболочкой баш для linux, автоматизация задач при помощи bash",{"faq":105,"how_to":106,"product":106},[],null,{},[109,113,116,119,122,125,129,132,135,138,141,144,147,150,153,156,159,162,165,168,171,174,177,180,183,186,189,192,195,198,201,204,207,210,213,216,219,222,225,228,231],{"level":110,"name":111,"anchor":112},1,"Что такое Bash","chto-takoe-bash",{"level":110,"name":114,"anchor":115},"Чем Bash отличается от sh, zsh и других оболочек","chem-bash-otlichaetsya-ot-sh-zsh-i-drugih-obolochek",{"level":110,"name":117,"anchor":118},"Для чего используют Bash-скрипты","dlya-chego-ispolzuyut-bash-skripty",{"level":110,"name":120,"anchor":121},"Основные команды Bash","osnovnye-komandy-bash",{"level":110,"name":123,"anchor":124},"Синтаксис Bash-скриптов","sintaksis-bash-skriptov",{"level":126,"name":127,"anchor":128},2,"Шебанг","shebang",{"level":126,"name":130,"anchor":131},"Комментарии","kommentarii",{"level":126,"name":133,"anchor":134},"Кавычки","kavychki",{"level":110,"name":136,"anchor":137},"Как создать и запустить Bash-скрипт","kak-sozdat-i-zapustit-bash-skript",{"level":110,"name":139,"anchor":140},"Переменные","peremennye",{"level":126,"name":142,"anchor":143},"Создание и использование","sozdanie-i-ispolzovanie",{"level":126,"name":145,"anchor":146},"Ввод данных от пользователя","vvod-dannyh-ot-polzovatelya",{"level":126,"name":148,"anchor":149},"Переменные окружения","peremennye-okruzheniya",{"level":126,"name":151,"anchor":152},"Арифметика","arifmetika",{"level":110,"name":154,"anchor":155},"Параметры командной строки","parametry-komandnoy-stroki",{"level":110,"name":157,"anchor":158},"Условные операторы","uslovnye-operatory",{"level":126,"name":160,"anchor":161},"Конструкция if","konstrukciya-if",{"level":126,"name":163,"anchor":164},"Сравнение чисел","sravnenie-chisel",{"level":126,"name":166,"anchor":167},"Сравнение строк","sravnenie-strok",{"level":126,"name":169,"anchor":170},"Проверка файлов","proverka-faylov",{"level":126,"name":172,"anchor":173},"Логические операторы","logicheskie-operatory",{"level":126,"name":175,"anchor":176},"Конструкция case","konstrukciya-case",{"level":110,"name":178,"anchor":179},"Циклы","cikly",{"level":126,"name":181,"anchor":182},"Цикл for","cikl-for",{"level":126,"name":184,"anchor":185},"Цикл while","cikl-while",{"level":126,"name":187,"anchor":188},"Цикл until","cikl-until",{"level":126,"name":190,"anchor":191},"break и continue","break-i-continue",{"level":110,"name":193,"anchor":194},"Функции","funkcii",{"level":126,"name":196,"anchor":197},"Объявление","obyavlenie",{"level":126,"name":199,"anchor":200},"Аргументы","argumenty",{"level":126,"name":202,"anchor":203},"Локальные переменные и возврат значений","lokalnye-peremennye-i-vozvrat-znacheniy",{"level":110,"name":205,"anchor":206},"Массивы","massivy",{"level":110,"name":208,"anchor":209},"Работа с файлами и директориями","rabota-s-faylami-i-direktoriyami",{"level":110,"name":211,"anchor":212},"Перенаправление потоков и конвейеры","perenapravlenie-potokov-i-konveyery",{"level":110,"name":214,"anchor":215},"Запуск скриптов по расписанию через cron","zapusk-skriptov-po-raspisaniyu-cherez-cron",{"level":110,"name":217,"anchor":218},"Отладка скриптов","otladka-skriptov",{"level":110,"name":220,"anchor":221},"Практические примеры скриптов","prakticheskie-primery-skriptov",{"level":126,"name":223,"anchor":224},"Резервное копирование сайта и базы данных","rezervnoe-kopirovanie-sayta-i-bazy-dannyh",{"level":126,"name":226,"anchor":227},"Проверка доступности сайта","proverka-dostupnosti-sayta",{"level":110,"name":229,"anchor":230},"FAQ","faq",{"level":110,"name":232,"anchor":233},"Заключение","zaklyuchenie",[],[236,240],{"route":237,"title":239},{"language":6,"path":238},"/kb/how-to","Полезные статьи",{"route":241,"title":21},{"language":6,"path":20},[243,245],{"src":244},"https://cp.beget.com/shared/EiWfFWOl_ChB6iLWY7WPZ23xPBuc34F-/linux-table-1.png",{"src":246},"https://cp.beget.com/shared/AerBVfHWAs-uNdekxfhkQT-mGKqNtFYy/linux-table-2.png",[],[249,258,267],{"route":250,"uuid":252,"title":253,"excerpt":27,"content":27,"view_count":16,"published_at":27,"modified_at":27,"like":106,"category":106,"hero_image":106,"seo_metadata":106,"schema_org_metadata":106,"open_graph_metadata":106,"sections":254,"tags":255,"breadcrumbs":256,"images":257},{"language":6,"path":251},"/kb/how-to/other/blokirovka-sajta-hosting-provajderom","3a04f2ff-5289-2b6a-3d64-8783cceb8a2d","Блокировка сайта хостинг-провайдером",[],[],[],[],{"route":259,"uuid":261,"title":262,"excerpt":27,"content":27,"view_count":16,"published_at":27,"modified_at":27,"like":106,"category":106,"hero_image":106,"seo_metadata":106,"schema_org_metadata":106,"open_graph_metadata":106,"sections":263,"tags":264,"breadcrumbs":265,"images":266},{"language":6,"path":260},"/kb/how-to/other/kak-polzovatsya-telnet","cfb10397-57fc-f7a9-0b74-22c33a358b9c","Как пользоваться Telnet",[],[],[],[],{"route":268,"uuid":270,"title":271,"excerpt":27,"content":27,"view_count":16,"published_at":27,"modified_at":27,"like":106,"category":106,"hero_image":106,"seo_metadata":106,"schema_org_metadata":106,"open_graph_metadata":106,"sections":272,"tags":273,"breadcrumbs":274,"images":275},{"language":6,"path":269},"/kb/how-to/other/video-kak-podklyuchit-yandeks-metriku-k-sajtu","14617fd7-c90b-6e20-5e58-600b1084bc1e","Видео: Как подключить Яндекс Метрику к сайту",[],[],[],[],"popularity-desc"]