[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"page-ru-/guides/linux/bash-scripting":3,"mdc-mjxk9e-key":576,"mdc--laissx-key":593,"mdc-8nwpsc-key":609,"mdc--tdv3g4-key":641,"mdc--z20l74-key":666,"mdc--y4ng9o-key":688,"mdc-offwio-key":703,"mdc-4xd5nm-key":720,"mdc--tqvy0g-key":741,"related-/guides/linux/shell-basics,/guides/linux/commands,/guides/linux/automation":762,"mdc-b589bf-key":763},{"id":4,"title":5,"appliesTo":6,"author":10,"body":11,"canonical":508,"code":508,"createdAt":509,"description":510,"difficulty":511,"draft":512,"estimatedTime":513,"extension":514,"faq":515,"howToSteps":528,"howToTotalTime":547,"image":508,"keywords":548,"locale":558,"meta":559,"navigation":285,"path":560,"platform":561,"related":562,"section":566,"seo":567,"severity":508,"stem":568,"summary":569,"tags":570,"twitterCreator":508,"twitterSite":508,"type":574,"updatedAt":509,"__hash__":575},"content_ru/guides/linux/bash-scripting.md","Напишите эффективный Bash-скрипт за 5 минут – полное руководство",[7,8,9],"Bash 5.x","Ubuntu 22.04","Debian 12","FixPedia Team",{"type":12,"value":13,"toc":496},"minimark",[14,19,23,27,40,44,56,99,103,110,131,157,161,164,219,222,226,229,244,259,263,266,299,302,306,313,345,352,421,425,428,436,439,443,492],[15,16,18],"h2",{"id":17},"введение","Введение",[20,21,22],"p",{},"Bash — это мощный интерпретатор командной строки в Linux, который позволяет автоматизировать повторяющиеся задачи. Написание простого Bash-скрипта занимает всего несколько минут, но при этом вы получаете инструмент, который может ускорить вашу работу и уменьшить количество рутинных действий. В этом руководстве мы создадим рабочий скрипт с нуля, шаг за шагом добавляя необходимые элементы.",[15,24,26],{"id":25},"требования","Требования",[28,29,30,34,37],"ul",{},[31,32,33],"li",{},"Bash 5.x (стандартный в современных дистрибутивах Linux)",[31,35,36],{},"Доступ к консоли с правами чтения/записи в целевом каталоге",[31,38,39],{},"Базовые знания команд Linux (навигация, редактирование файлов)",[15,41,43],{"id":42},"шаг-1-создайте-скрипт","Шаг 1: Создайте скрипт",[20,45,46,47,51,52,55],{},"Сначала создайте файл со скриптом. Выберите подходящее имя, например ",[48,49,50],"code",{},"my_script.sh",", и поместите его в каталог, к которому у вас есть доступ (например, ",[48,53,54],{},"~/scripts",").",[57,58,63],"pre",{"className":59,"code":60,"language":61,"meta":62,"style":62},"language-bash shiki shiki-themes github-light github-dark","mkdir -p ~/scripts\ncd ~/scripts\ntouch my_script.sh\n","bash","",[48,64,65,82,90],{"__ignoreMap":62},[66,67,70,74,78],"span",{"class":68,"line":69},"line",1,[66,71,73],{"class":72},"sScJk","mkdir",[66,75,77],{"class":76},"sj4cs"," -p",[66,79,81],{"class":80},"sZZnC"," ~/scripts\n",[66,83,85,88],{"class":68,"line":84},2,[66,86,87],{"class":76},"cd",[66,89,81],{"class":80},[66,91,93,96],{"class":68,"line":92},3,[66,94,95],{"class":72},"touch",[66,97,98],{"class":80}," my_script.sh\n",[15,100,102],{"id":101},"шаг-2-добавьте-shebang","Шаг 2: Добавьте shebang",[20,104,105,106,109],{},"Первая строка любого Bash-скрипта должна указывать интерпретатор. Добавьте строку ",[48,107,108],{},"#!/bin/bash"," в начало файла.",[57,111,113],{"className":59,"code":112,"language":61,"meta":62,"style":62},"# Редактор: используйте любой текстовый редакатор (nano, vim, nano \u003Cfile>)\n# Первая строка:\n#!/bin/bash\n",[48,114,115,121,126],{"__ignoreMap":62},[66,116,117],{"class":68,"line":69},[66,118,120],{"class":119},"sJ8bj","# Редактор: используйте любой текстовый редакатор (nano, vim, nano \u003Cfile>)\n",[66,122,123],{"class":68,"line":84},[66,124,125],{"class":119},"# Первая строка:\n",[66,127,128],{"class":68,"line":92},[66,129,130],{"class":119},"#!/bin/bash\n",[132,133,134],"blockquote",{},[20,135,136,140,141,144,145,148,149,152,153,156],{},[137,138,139],"strong",{},"💡 Совет:"," Если вы используете ",[48,142,143],{},"nano",", вы можете добавить shebang с помощью ",[48,146,147],{},"Ctrl+O",", затем ",[48,150,151],{},"Enter",", и сохранить файл с ",[48,154,155],{},"Ctrl+X",".",[15,158,160],{"id":159},"шаг-3-напишите-основную-логику","Шаг 3: Напишите основную логику",[20,162,163],{},"Теперь добавьте полезный код. В качестве примера мы реализуем простой цикл, который выводит пять строк.",[57,165,167],{"className":59,"code":166,"language":61,"meta":62,"style":62},"# Пример цикла for: вывод строк \"Строка 1\" … \"Строка 5\"\nfor i in {1..5}; do\n    echo \"Строка $i\"\ndone\n",[48,168,169,174,199,213],{"__ignoreMap":62},[66,170,171],{"class":68,"line":69},[66,172,173],{"class":119},"# Пример цикла for: вывод строк \"Строка 1\" … \"Строка 5\"\n",[66,175,176,180,184,187,190,193,196],{"class":68,"line":84},[66,177,179],{"class":178},"szBVR","for",[66,181,183],{"class":182},"sVt8B"," i ",[66,185,186],{"class":178},"in",[66,188,189],{"class":182}," {",[66,191,192],{"class":72},"1..5}",[66,194,195],{"class":182},"; ",[66,197,198],{"class":178},"do\n",[66,200,201,204,207,210],{"class":68,"line":92},[66,202,203],{"class":76},"    echo",[66,205,206],{"class":80}," \"Строка ",[66,208,209],{"class":182},"$i",[66,211,212],{"class":80},"\"\n",[66,214,216],{"class":68,"line":215},4,[66,217,218],{"class":178},"done\n",[220,221],"in-article-ad",{},[15,223,225],{"id":224},"шаг-4-сделайте-скрипт-исполняемым","Шаг 4: Сделайте скрипт исполняемым",[20,227,228],{},"После редактирования сделайте скрипт исполняемым. Это позволит запускать его напрямую.",[57,230,232],{"className":59,"code":231,"language":61,"meta":62,"style":62},"chmod +x my_script.sh\n",[48,233,234],{"__ignoreMap":62},[66,235,236,239,242],{"class":68,"line":69},[66,237,238],{"class":72},"chmod",[66,240,241],{"class":80}," +x",[66,243,98],{"class":80},[132,245,246],{},[20,247,248,251,252,255,256,156],{},[137,249,250],{},"⚠️ Важно:"," Без флага ",[48,253,254],{},"+x"," скрипт можно запустить только через ",[48,257,258],{},"bash my_script.sh",[15,260,262],{"id":261},"шаг-5-запустите-скрипт","Шаг 5: Запустите скрипт",[20,264,265],{},"Теперь вы можете выполнить скрипт. Два распространённых способа:",[57,267,269],{"className":59,"code":268,"language":61,"meta":62,"style":62},"# Способ 1: напрямую (работает, если установлен флаг исполняемого файла)\n./my_script.sh\n\n# Способ 2: через интерпретатор Bash\nbash my_script.sh\n",[48,270,271,276,281,287,292],{"__ignoreMap":62},[66,272,273],{"class":68,"line":69},[66,274,275],{"class":119},"# Способ 1: напрямую (работает, если установлен флаг исполняемого файла)\n",[66,277,278],{"class":68,"line":84},[66,279,280],{"class":72},"./my_script.sh\n",[66,282,283],{"class":68,"line":92},[66,284,286],{"emptyLinePlaceholder":285},true,"\n",[66,288,289],{"class":68,"line":215},[66,290,291],{"class":119},"# Способ 2: через интерпретатор Bash\n",[66,293,295,297],{"class":68,"line":294},5,[66,296,61],{"class":72},[66,298,98],{"class":80},[20,300,301],{},"Оба варианта дадут одинаковый результат: вывод пяти строк.",[15,303,305],{"id":304},"шаг-6-добавьте-обработку-ошибок","Шаг 6: Добавьте обработку ошибок",[20,307,308,309,312],{},"Для надежности добавьте базовую обработку ошибок. Команда ",[48,310,311],{},"set -e"," заставит скрипт прерываться при ошибке выполнения любой команды.",[57,314,316],{"className":59,"code":315,"language":61,"meta":62,"style":62},"# Прерывать выполнение при ошибке\nset -e\n\n# Пример безопасного удаления файла (раскомментируйте для теста)\n# rm -f /tmp/example_file\n",[48,317,318,323,331,335,340],{"__ignoreMap":62},[66,319,320],{"class":68,"line":69},[66,321,322],{"class":119},"# Прерывать выполнение при ошибке\n",[66,324,325,328],{"class":68,"line":84},[66,326,327],{"class":76},"set",[66,329,330],{"class":76}," -e\n",[66,332,333],{"class":68,"line":92},[66,334,286],{"emptyLinePlaceholder":285},[66,336,337],{"class":68,"line":215},[66,338,339],{"class":119},"# Пример безопасного удаления файла (раскомментируйте для теста)\n",[66,341,342],{"class":68,"line":294},[66,343,344],{"class":119},"# rm -f /tmp/example_file\n",[20,346,347,348,351],{},"Если вы хотите вручную проверить код возврата, используйте конструкцию ",[48,349,350],{},"if",":",[57,353,355],{"className":59,"code":354,"language":61,"meta":62,"style":62},"# Пример проверки кода возврата команды\ncp source.txt dest.txt\nif [ $? -eq 0 ]; then\n    echo \"Копирование успешно\"\nelse\n    echo \"Ошибка копирования\"\nfi\n",[48,356,357,362,373,395,402,407,415],{"__ignoreMap":62},[66,358,359],{"class":68,"line":69},[66,360,361],{"class":119},"# Пример проверки кода возврата команды\n",[66,363,364,367,370],{"class":68,"line":84},[66,365,366],{"class":72},"cp",[66,368,369],{"class":80}," source.txt",[66,371,372],{"class":80}," dest.txt\n",[66,374,375,377,380,383,386,389,392],{"class":68,"line":92},[66,376,350],{"class":178},[66,378,379],{"class":182}," [ ",[66,381,382],{"class":76},"$?",[66,384,385],{"class":178}," -eq",[66,387,388],{"class":76}," 0",[66,390,391],{"class":182}," ]; ",[66,393,394],{"class":178},"then\n",[66,396,397,399],{"class":68,"line":215},[66,398,203],{"class":76},[66,400,401],{"class":80}," \"Копирование успешно\"\n",[66,403,404],{"class":68,"line":294},[66,405,406],{"class":178},"else\n",[66,408,410,412],{"class":68,"line":409},6,[66,411,203],{"class":76},[66,413,414],{"class":80}," \"Ошибка копирования\"\n",[66,416,418],{"class":68,"line":417},7,[66,419,420],{"class":178},"fi\n",[15,422,424],{"id":423},"проверка-результата","Проверка результата",[20,426,427],{},"Запустите скрипт и убедитесь, что вывод соответствует ожиданиям:",[57,429,434],{"className":430,"code":432,"language":433},[431],"language-text","Строка 1\nСтрока 2\nСтрока 3\nСтрока 4\nСтрока 5\n","text",[48,435,432],{"__ignoreMap":62},[20,437,438],{},"Если вы видите это, скрипт работает корректно.",[15,440,442],{"id":441},"возможные-проблемы","Возможные проблемы",[28,444,445,453,474],{},[31,446,447,450,451,156],{},[137,448,449],{},"Shebang отсутствует или неправилен"," – скрипт может быть выполнен другим интерпретатором или будет отклонён. Убедитесь, что первая строка точно ",[48,452,108],{},[31,454,455,458,459,462,463,466,467,470,471,473],{},[137,456,457],{},"Отсутствие прав на выполнение"," – если ",[48,460,461],{},"chmod +x"," не был выполнен, запуск через ",[48,464,465],{},"./my_script.sh"," вызовет ошибку ",[48,468,469],{},"Permission denied",". Используйте ",[48,472,258],{}," в качестве альтернативы.",[31,475,476,479,480,483,484,487,488,491],{},[137,477,478],{},"Ошибки синтаксиса"," – Bash выведет сообщение об ошибке, например ",[48,481,482],{},"my_script.sh: command not found"," или ",[48,485,486],{},"syntax error",". Проверьте скрипт с помощью ",[48,489,490],{},"bash -n my_script.sh",", чтобы выявить проблемы без его запуска.",[493,494,495],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}",{"title":62,"searchDepth":84,"depth":84,"links":497},[498,499,500,501,502,503,504,505,506,507],{"id":17,"depth":84,"text":18},{"id":25,"depth":84,"text":26},{"id":42,"depth":84,"text":43},{"id":101,"depth":84,"text":102},{"id":159,"depth":84,"text":160},{"id":224,"depth":84,"text":225},{"id":261,"depth":84,"text":262},{"id":304,"depth":84,"text":305},{"id":423,"depth":84,"text":424},{"id":441,"depth":84,"text":442},null,"2026-07-13 08:43:33","Создавайте Bash-скрипты для автоматизации Linux-задач менее чем за 10 минут: пошаговое руководство с примерами кода и скриптом для доработки.","medium",false,"10-15 мин","md",[516,519,522,525],{"question":517,"answer":518},"Как создать новый Bash-скрипт?","Создайте файл с расширением .sh (например, my_script.sh) и сделайте его исполняемым с помощью `chmod +x`.",{"question":520,"answer":521},"Для чего используются shebang-строки?","Shebang (например, `#!/bin/bash`) указывает системе, какую интерпретатор использовать для выполнения скрипта.",{"question":523,"answer":524},"Как отладить скрипт?","Добавьте `set -x` для принудительного вывода всех выполняемых команд, используйте `echo` для отладочных сообщений или запустите скрипт с помощью `bash -x`.",{"question":526,"answer":527},"Как передать параметры скрипту?","Параметры передаются через переменные `$1`, `$2` и т.д.; используйте циклы для обработки произвольного количества аргументов.",[529,532,535,538,541,544],{"name":530,"text":531},"Создайте скрипт","Создайте новый файл `my_script.sh` в удобном каталоге, например `~/scripts`.",{"name":533,"text":534},"Добавьте shebang","В первой строке файла укажите интерпретатор: `#!/bin/bash`.",{"name":536,"text":537},"Напишите основную логику","Добавьте команды, например цикл для вывода строк:\n```bash\nfor i in {1..5}; do echo \"Строка $i\"; done\n```",{"name":539,"text":540},"Сделайте скрипт исполняемым","Выполните `chmod +x my_script.sh`, чтобы получить права на выполнение.",{"name":542,"text":543},"Запустите скрипт","Запустите скрипт с помощью `./my_script.sh` или `bash my_script.sh`.",{"name":545,"text":546},"Добавьте обработку ошибок","Добавьте `set -e`, чтобы прерывать выполнение при ошибке, или обрабатывайте код возврата команд с помощью `if`.","PT15M",[549,550,551,552,553,554,555,556,557],"Bash скрипт","написать скрипт","автоматизация Linux","bash команды","bash тестирование","bash отладка","bash синтаксис","скриптинг Ubuntu","скриптинг Debian","ru_RU",{},"/guides/linux/bash-scripting","linux",[563,564,565],"/guides/linux/shell-basics","/guides/linux/commands","/guides/linux/automation","Гайды по Bash и скриптингу",{"title":5,"description":510},"guides/linux/bash-scripting","В этом руководстве вы узнаете, как быстро написать полезный Bash-скрипт для автоматизации повседневных задач в Linux.",[61,561,571,572,573],"скриптинг","автоматизация","shell","guide","JfvLK1Xpj9erppZnxQUik_VK940DMW78IU96L_hHoXk",{"data":577,"body":578},{},{"type":579,"children":580},"root",[581],{"type":582,"tag":20,"props":583,"children":584},"element",{},[585,587,592],{"type":433,"value":586},"Создайте файл с расширением .sh (например, my_script.sh) и сделайте его исполняемым с помощью ",{"type":582,"tag":48,"props":588,"children":590},{"className":589},[],[591],{"type":433,"value":461},{"type":433,"value":156},{"data":594,"body":595},{},{"type":579,"children":596},[597],{"type":582,"tag":20,"props":598,"children":599},{},[600,602,607],{"type":433,"value":601},"Shebang (например, ",{"type":582,"tag":48,"props":603,"children":605},{"className":604},[],[606],{"type":433,"value":108},{"type":433,"value":608},") указывает системе, какую интерпретатор использовать для выполнения скрипта.",{"data":610,"body":611},{},{"type":579,"children":612},[613],{"type":582,"tag":20,"props":614,"children":615},{},[616,618,624,626,632,634,640],{"type":433,"value":617},"Добавьте ",{"type":582,"tag":48,"props":619,"children":621},{"className":620},[],[622],{"type":433,"value":623},"set -x",{"type":433,"value":625}," для принудительного вывода всех выполняемых команд, используйте ",{"type":582,"tag":48,"props":627,"children":629},{"className":628},[],[630],{"type":433,"value":631},"echo",{"type":433,"value":633}," для отладочных сообщений или запустите скрипт с помощью ",{"type":582,"tag":48,"props":635,"children":637},{"className":636},[],[638],{"type":433,"value":639},"bash -x",{"type":433,"value":156},{"data":642,"body":643},{},{"type":579,"children":644},[645],{"type":582,"tag":20,"props":646,"children":647},{},[648,650,656,658,664],{"type":433,"value":649},"Параметры передаются через переменные ",{"type":582,"tag":48,"props":651,"children":653},{"className":652},[],[654],{"type":433,"value":655},"$1",{"type":433,"value":657},", ",{"type":582,"tag":48,"props":659,"children":661},{"className":660},[],[662],{"type":433,"value":663},"$2",{"type":433,"value":665}," и т.д.; используйте циклы для обработки произвольного количества аргументов.",{"data":667,"body":668},{},{"type":579,"children":669},[670],{"type":582,"tag":20,"props":671,"children":672},{},[673,675,680,682,687],{"type":433,"value":674},"Создайте новый файл ",{"type":582,"tag":48,"props":676,"children":678},{"className":677},[],[679],{"type":433,"value":50},{"type":433,"value":681}," в удобном каталоге, например ",{"type":582,"tag":48,"props":683,"children":685},{"className":684},[],[686],{"type":433,"value":54},{"type":433,"value":156},{"data":689,"body":690},{},{"type":579,"children":691},[692],{"type":582,"tag":20,"props":693,"children":694},{},[695,697,702],{"type":433,"value":696},"В первой строке файла укажите интерпретатор: ",{"type":582,"tag":48,"props":698,"children":700},{"className":699},[],[701],{"type":433,"value":108},{"type":433,"value":156},{"data":704,"body":705},{},{"type":579,"children":706},[707],{"type":582,"tag":20,"props":708,"children":709},{},[710,712,718],{"type":433,"value":711},"Выполните ",{"type":582,"tag":48,"props":713,"children":715},{"className":714},[],[716],{"type":433,"value":717},"chmod +x my_script.sh",{"type":433,"value":719},", чтобы получить права на выполнение.",{"data":721,"body":722},{},{"type":579,"children":723},[724],{"type":582,"tag":20,"props":725,"children":726},{},[727,729,734,735,740],{"type":433,"value":728},"Запустите скрипт с помощью ",{"type":582,"tag":48,"props":730,"children":732},{"className":731},[],[733],{"type":433,"value":465},{"type":433,"value":483},{"type":582,"tag":48,"props":736,"children":738},{"className":737},[],[739],{"type":433,"value":258},{"type":433,"value":156},{"data":742,"body":743},{},{"type":579,"children":744},[745],{"type":582,"tag":20,"props":746,"children":747},{},[748,749,754,756,761],{"type":433,"value":617},{"type":582,"tag":48,"props":750,"children":752},{"className":751},[],[753],{"type":433,"value":311},{"type":433,"value":755},", чтобы прерывать выполнение при ошибке, или обрабатывайте код возврата команд с помощью ",{"type":582,"tag":48,"props":757,"children":759},{"className":758},[],[760],{"type":433,"value":350},{"type":433,"value":156},[],{"data":764,"body":765},{},{"type":579,"children":766},[767,772,782],{"type":582,"tag":20,"props":768,"children":769},{},[770],{"type":433,"value":771},"Добавьте команды, например цикл для вывода строк:",{"type":582,"tag":57,"props":773,"children":777},{"className":774,"code":775,"language":61,"meta":62,"style":776},"language-bash","for i in {1..5}; do echo \"Строка $i\"; done\n","undefined",[778],{"type":582,"tag":48,"props":779,"children":780},{"__ignoreMap":62},[781],{"type":433,"value":775},{"type":582,"tag":493,"props":783,"children":784},{},[785],{"type":433,"value":62}]