[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"page-ru-/guides/linux/bash-scripting-basics":3,"mdc-big9yz-key":1142,"mdc-clauwd-key":1166,"mdc-8xxx8x-key":1195,"mdc--tiqltv-key":1253,"mdc-5inpw4-key":1284,"mdc--tp90wg-key":1301,"mdc-4nt4qr-key":1317,"mdc-eeu7md-key":1333,"mdc-ma76wn-key":1350,"related-/guides/linux/cron-jobs-basics,/guides/linux/awk-text-processing,/guides/linux/sed-basics":1374},{"id":4,"title":5,"appliesTo":6,"author":11,"body":12,"canonical":1074,"code":1074,"createdAt":1075,"description":1076,"difficulty":1077,"draft":1078,"estimatedTime":1079,"extension":1080,"faq":1081,"howToSteps":1094,"howToTotalTime":1110,"image":1074,"keywords":1111,"locale":1123,"meta":1124,"navigation":602,"path":1125,"platform":1126,"related":1127,"section":1131,"seo":1132,"severity":1074,"stem":1133,"summary":1134,"tags":1135,"twitterCreator":1074,"twitterSite":1074,"type":1140,"updatedAt":1075,"__hash__":1141},"content_ru/guides/linux/bash-scripting-basics.md","Bash скриптинг: основы для начинающих",[7,8,9,10],"Bash 4.0+","Ubuntu 20.04+","Debian 10+","CentOS 7+","FixPedia Team",{"type":13,"value":14,"toc":1064},"minimark",[15,19,24,36,65,79,96,99,108,127,131,138,168,171,197,200,231,238,315,321,332,336,339,386,392,452,457,517,531,535,538,546,643,650,708,716,758,767,771,774,868,889,893,896,930,934,1004,1008,1011,1057,1060],[16,17,18],"p",{},"Bash-скриптинг — основной способ автоматизации в Linux. С помощью скриптов вы объединяете команды, создаёте собственные утилиты и убираете рутинные действия. Этот гайд покажет, как создать первый скрипт, работать с переменными, условиями, циклами и функциями. Вы сможете писать простые, но эффективные скрипты сразу после прочтения.",[20,21,23],"h3",{"id":22},"создание-и-запуск-первого-скрипта","Создание и запуск первого скрипта",[16,25,26,27,31,32,35],{},"Начнём с минимального рабочего примера. Создайте файл ",[28,29,30],"code",{},"hello.sh"," и откройте его в редакторе (",[28,33,34],{},"nano hello.sh","). Добавьте содержимое:",[37,38,43],"pre",{"className":39,"code":40,"language":41,"meta":42,"style":42},"language-bash shiki shiki-themes github-light github-dark","#!/usr/bin/env bash\necho \"Привет, мир!\"\n","bash","",[28,44,45,54],{"__ignoreMap":42},[46,47,50],"span",{"class":48,"line":49},"line",1,[46,51,53],{"class":52},"sJ8bj","#!/usr/bin/env bash\n",[46,55,57,61],{"class":48,"line":56},2,[46,58,60],{"class":59},"sj4cs","echo",[46,62,64],{"class":63},"sZZnC"," \"Привет, мир!\"\n",[16,66,67,68,71,72,71,75,78],{},"Сохраните файл (",[28,69,70],{},"Ctrl+O",", ",[28,73,74],{},"Enter",[28,76,77],{},"Ctrl+X"," в nano). Сделайте его исполняемым:",[37,80,82],{"className":39,"code":81,"language":41,"meta":42,"style":42},"chmod +x hello.sh\n",[28,83,84],{"__ignoreMap":42},[46,85,86,90,93],{"class":48,"line":49},[46,87,89],{"class":88},"sScJk","chmod",[46,91,92],{"class":63}," +x",[46,94,95],{"class":63}," hello.sh\n",[16,97,98],{},"Запустите из той же директории:",[37,100,102],{"className":39,"code":101,"language":41,"meta":42,"style":42},"./hello.sh\n",[28,103,104],{"__ignoreMap":42},[46,105,106],{"class":48,"line":49},[46,107,101],{"class":88},[16,109,110,111,114,115,118,119,122,123,126],{},"Вывод: ",[28,112,113],{},"Привет, мир!",". Если видите ",[28,116,117],{},"Permission denied",", проверьте права через ",[28,120,121],{},"ls -l hello.sh"," и повторно выполните ",[28,124,125],{},"chmod +x",".",[20,128,130],{"id":129},"переменные-и-аргументы-командной-строки","Переменные и аргументы командной строки",[16,132,133,134,137],{},"Переменные хранят данные для повторного использования. Объявляйте без пробелов вокруг ",[28,135,136],{},"=",":",[37,139,141],{"className":39,"code":140,"language":41,"meta":42,"style":42},"USERNAME=\"Алексей\"\necho \"Добро пожаловать, $USERNAME!\"\n",[28,142,143,155],{"__ignoreMap":42},[46,144,145,149,152],{"class":48,"line":49},[46,146,148],{"class":147},"sVt8B","USERNAME",[46,150,136],{"class":151},"szBVR",[46,153,154],{"class":63},"\"Алексей\"\n",[46,156,157,159,162,165],{"class":48,"line":56},[46,158,60],{"class":59},[46,160,161],{"class":63}," \"Добро пожаловать, ",[46,163,164],{"class":147},"$USERNAME",[46,166,167],{"class":63},"!\"\n",[16,169,170],{},"Для кавычек внутри значений используйте экранирование или внешние кавычки:",[37,172,174],{"className":39,"code":173,"language":41,"meta":42,"style":42},"MESSAGE=\"Он сказал: \\\"Привет!\\\"\"\n",[28,175,176],{"__ignoreMap":42},[46,177,178,181,183,186,189,192,194],{"class":48,"line":49},[46,179,180],{"class":147},"MESSAGE",[46,182,136],{"class":151},[46,184,185],{"class":63},"\"Он сказал: ",[46,187,188],{"class":59},"\\\"",[46,190,191],{"class":63},"Привет!",[46,193,188],{"class":59},[46,195,196],{"class":63},"\"\n",[16,198,199],{},"Аргументы делают скрипт гибким. Доступ к ним:",[201,202,203,213,219,225],"ul",{},[204,205,206,71,209,212],"li",{},[28,207,208],{},"$1",[28,210,211],{},"$2"," — первый, второй аргумент.",[204,214,215,218],{},[28,216,217],{},"$@"," — все аргументы как отдельные слова.",[204,220,221,224],{},[28,222,223],{},"$#"," — количество аргументов.",[204,226,227,230],{},[28,228,229],{},"$0"," — имя скрипта.",[16,232,233,234,237],{},"Пример ",[28,235,236],{},"greet.sh"," с проверкой аргументов:",[37,239,241],{"className":39,"code":240,"language":41,"meta":42,"style":42},"#!/usr/bin/env bash\nif [ $# -eq 0 ]; then\n    echo \"Использование: $0 \u003Cимя>\"\n    exit 1\nfi\necho \"Привет, $1! Получено аргументов: $#\"\n",[28,242,243,247,269,283,292,298],{"__ignoreMap":42},[46,244,245],{"class":48,"line":49},[46,246,53],{"class":52},[46,248,249,252,255,257,260,263,266],{"class":48,"line":56},[46,250,251],{"class":151},"if",[46,253,254],{"class":147}," [ ",[46,256,223],{"class":59},[46,258,259],{"class":151}," -eq",[46,261,262],{"class":59}," 0",[46,264,265],{"class":147}," ]; ",[46,267,268],{"class":151},"then\n",[46,270,272,275,278,280],{"class":48,"line":271},3,[46,273,274],{"class":59},"    echo",[46,276,277],{"class":63}," \"Использование: ",[46,279,229],{"class":59},[46,281,282],{"class":63}," \u003Cимя>\"\n",[46,284,286,289],{"class":48,"line":285},4,[46,287,288],{"class":59},"    exit",[46,290,291],{"class":59}," 1\n",[46,293,295],{"class":48,"line":294},5,[46,296,297],{"class":151},"fi\n",[46,299,301,303,306,308,311,313],{"class":48,"line":300},6,[46,302,60],{"class":59},[46,304,305],{"class":63}," \"Привет, ",[46,307,208],{"class":59},[46,309,310],{"class":63},"! Получено аргументов: ",[46,312,223],{"class":59},[46,314,196],{"class":63},[16,316,317,318,126],{},"Запуск: ",[28,319,320],{},"./greet.sh Мария",[322,323,326],"image-with-caption",{"alt":324,"src":325},"Пример bash-скрипта с переменными и аргументами командной строки","/images/guides/linux/bash-scripting-basics/bash-variables-arguments-example.png",[16,327,328],{},[329,330,331],"em",{},"Использование переменных и аргументов в bash-скрипте",[20,333,335],{"id":334},"условные-операторы-if","Условные операторы if",[16,337,338],{},"Условия позволяют ветвить логику. Базовый синтаксис:",[37,340,342],{"className":39,"code":341,"language":41,"meta":42,"style":42},"if [ условие ]; then\n    команды\nelif [ другое_условие ]; then\n    команды\nelse\n    команды\nfi\n",[28,343,344,353,358,368,372,377,381],{"__ignoreMap":42},[46,345,346,348,351],{"class":48,"line":49},[46,347,251],{"class":151},[46,349,350],{"class":147}," [ условие ]; ",[46,352,268],{"class":151},[46,354,355],{"class":48,"line":56},[46,356,357],{"class":88},"    команды\n",[46,359,360,363,366],{"class":48,"line":271},[46,361,362],{"class":151},"elif",[46,364,365],{"class":147}," [ другое_условие ]; ",[46,367,268],{"class":151},[46,369,370],{"class":48,"line":285},[46,371,357],{"class":88},[46,373,374],{"class":48,"line":294},[46,375,376],{"class":151},"else\n",[46,378,379],{"class":48,"line":300},[46,380,357],{"class":88},[46,382,384],{"class":48,"line":383},7,[46,385,297],{"class":151},[16,387,388],{},[389,390,391],"strong",{},"Пример: проверка количества аргументов",[37,393,395],{"className":39,"code":394,"language":41,"meta":42,"style":42},"#!/usr/bin/env bash\nif [ $# -lt 2 ]; then\n    echo \"Ошибка: нужно два аргумента.\"\n    exit 1\nfi\necho \"Аргументы: $1 и $2\"\n",[28,396,397,401,419,426,432,436],{"__ignoreMap":42},[46,398,399],{"class":48,"line":49},[46,400,53],{"class":52},[46,402,403,405,407,409,412,415,417],{"class":48,"line":56},[46,404,251],{"class":151},[46,406,254],{"class":147},[46,408,223],{"class":59},[46,410,411],{"class":151}," -lt",[46,413,414],{"class":59}," 2",[46,416,265],{"class":147},[46,418,268],{"class":151},[46,420,421,423],{"class":48,"line":271},[46,422,274],{"class":59},[46,424,425],{"class":63}," \"Ошибка: нужно два аргумента.\"\n",[46,427,428,430],{"class":48,"line":285},[46,429,288],{"class":59},[46,431,291],{"class":59},[46,433,434],{"class":48,"line":294},[46,435,297],{"class":151},[46,437,438,440,443,445,448,450],{"class":48,"line":300},[46,439,60],{"class":59},[46,441,442],{"class":63}," \"Аргументы: ",[46,444,208],{"class":59},[46,446,447],{"class":63}," и ",[46,449,211],{"class":59},[46,451,196],{"class":63},[16,453,454],{},[389,455,456],{},"Операторы сравнения:",[201,458,459,486,502],{},[204,460,461,462,465,466,469,470,473,474,477,478,481,482,485],{},"Числа: ",[28,463,464],{},"-eq"," (равно), ",[28,467,468],{},"-ne"," (не равно), ",[28,471,472],{},"-lt"," (меньше), ",[28,475,476],{},"-le"," (меньше или равно), ",[28,479,480],{},"-gt"," (больше), ",[28,483,484],{},"-ge"," (больше или равно).",[204,487,488,489,465,491,469,494,497,498,501],{},"Строки: ",[28,490,136],{},[28,492,493],{},"!=",[28,495,496],{},"-z"," (пустая строка), ",[28,499,500],{},"-n"," (не пустая).",[204,503,504,505,508,509,512,513,516],{},"Файлы: ",[28,506,507],{},"-e"," (существует), ",[28,510,511],{},"-f"," (обычный файл), ",[28,514,515],{},"-d"," (директория).",[518,519,520],"blockquote",{},[16,521,522,523,526,527,530],{},"💡 ",[389,524,525],{},"Совет:"," Всегда заключайте переменные в двойные кавычки: ",[28,528,529],{},"[ -n \"$VAR\" ]",". Это предотвратит ошибки, если переменная пуста или содержит пробелы.",[20,532,534],{"id":533},"циклы","Циклы",[16,536,537],{},"Циклы повторяют блок кода.",[16,539,540],{},[389,541,542,543,137],{},"Цикл ",[28,544,545],{},"for",[37,547,549],{"className":39,"code":548,"language":41,"meta":42,"style":42},"# Перебор списка\nfor fruit in яблоко банан апельсин; do\n    echo \"Фрукт: $fruit\"\ndone\n\n# Перебор файлов .log\nfor log in *.log; do\n    echo \"Обработка $log\"\ndone\n",[28,550,551,556,581,593,598,604,609,625,638],{"__ignoreMap":42},[46,552,553],{"class":48,"line":49},[46,554,555],{"class":52},"# Перебор списка\n",[46,557,558,560,563,566,569,572,575,578],{"class":48,"line":56},[46,559,545],{"class":151},[46,561,562],{"class":147}," fruit ",[46,564,565],{"class":151},"in",[46,567,568],{"class":63}," яблоко",[46,570,571],{"class":63}," банан",[46,573,574],{"class":63}," апельсин",[46,576,577],{"class":147},"; ",[46,579,580],{"class":151},"do\n",[46,582,583,585,588,591],{"class":48,"line":271},[46,584,274],{"class":59},[46,586,587],{"class":63}," \"Фрукт: ",[46,589,590],{"class":147},"$fruit",[46,592,196],{"class":63},[46,594,595],{"class":48,"line":285},[46,596,597],{"class":151},"done\n",[46,599,600],{"class":48,"line":294},[46,601,603],{"emptyLinePlaceholder":602},true,"\n",[46,605,606],{"class":48,"line":300},[46,607,608],{"class":52},"# Перебор файлов .log\n",[46,610,611,613,616,618,621,623],{"class":48,"line":383},[46,612,545],{"class":151},[46,614,615],{"class":147}," log ",[46,617,565],{"class":151},[46,619,620],{"class":63}," *.log",[46,622,577],{"class":147},[46,624,580],{"class":151},[46,626,628,630,633,636],{"class":48,"line":627},8,[46,629,274],{"class":59},[46,631,632],{"class":63}," \"Обработка ",[46,634,635],{"class":147},"$log",[46,637,196],{"class":63},[46,639,641],{"class":48,"line":640},9,[46,642,597],{"class":151},[16,644,645],{},[389,646,542,647,137],{},[28,648,649],{},"while",[37,651,653],{"className":39,"code":652,"language":41,"meta":42,"style":42},"counter=1\nwhile [ $counter -le 5 ]; do\n    echo \"Счётчик: $counter\"\n    ((counter++))\ndone\n",[28,654,655,665,681,693,704],{"__ignoreMap":42},[46,656,657,660,662],{"class":48,"line":49},[46,658,659],{"class":147},"counter",[46,661,136],{"class":151},[46,663,664],{"class":63},"1\n",[46,666,667,669,672,674,677,679],{"class":48,"line":56},[46,668,649],{"class":151},[46,670,671],{"class":147}," [ $counter ",[46,673,476],{"class":151},[46,675,676],{"class":59}," 5",[46,678,265],{"class":147},[46,680,580],{"class":151},[46,682,683,685,688,691],{"class":48,"line":271},[46,684,274],{"class":59},[46,686,687],{"class":63}," \"Счётчик: ",[46,689,690],{"class":147},"$counter",[46,692,196],{"class":63},[46,694,695,698,701],{"class":48,"line":285},[46,696,697],{"class":147},"    ((counter",[46,699,700],{"class":151},"++",[46,702,703],{"class":147},"))\n",[46,705,706],{"class":48,"line":294},[46,707,597],{"class":151},[16,709,710,715],{},[389,711,542,712],{},[28,713,714],{},"until"," (выполняется, пока условие ложно):",[37,717,719],{"className":39,"code":718,"language":41,"meta":42,"style":42},"until [ $counter -gt 5 ]; do\n    echo \"Значение: $counter\"\n    ((counter++))\ndone\n",[28,720,721,735,746,754],{"__ignoreMap":42},[46,722,723,725,727,729,731,733],{"class":48,"line":49},[46,724,714],{"class":151},[46,726,671],{"class":147},[46,728,480],{"class":151},[46,730,676],{"class":59},[46,732,265],{"class":147},[46,734,580],{"class":151},[46,736,737,739,742,744],{"class":48,"line":56},[46,738,274],{"class":59},[46,740,741],{"class":63}," \"Значение: ",[46,743,690],{"class":147},[46,745,196],{"class":63},[46,747,748,750,752],{"class":48,"line":271},[46,749,697],{"class":147},[46,751,700],{"class":151},[46,753,703],{"class":147},[46,755,756],{"class":48,"line":285},[46,757,597],{"class":151},[322,759,762],{"alt":760,"src":761},"Примеры циклов for и while в bash-скрипте с кодом","/images/guides/linux/bash-scripting-basics/bash-loops-example.png",[16,763,764],{},[329,765,766],{},"Использование циклов для повторения задач в bash",[20,768,770],{"id":769},"функции","Функции",[16,772,773],{},"Функции структурируют код и избегают дублирования.",[37,775,777],{"className":39,"code":776,"language":41,"meta":42,"style":42},"#!/usr/bin/env bash\n\n# Определение\nprint_time() {\n    local message=$1\n    echo \"[$(date +%H:%M:%S)] $message\"\n}\n\n# Вызов\nprint_time \"Скрипт начался\"\n# ... ваш код ...\nprint_time \"Скрипт завершён\"\n",[28,778,779,783,787,792,800,814,832,837,841,846,854,860],{"__ignoreMap":42},[46,780,781],{"class":48,"line":49},[46,782,53],{"class":52},[46,784,785],{"class":48,"line":56},[46,786,603],{"emptyLinePlaceholder":602},[46,788,789],{"class":48,"line":271},[46,790,791],{"class":52},"# Определение\n",[46,793,794,797],{"class":48,"line":285},[46,795,796],{"class":88},"print_time",[46,798,799],{"class":147},"() {\n",[46,801,802,805,808,810],{"class":48,"line":294},[46,803,804],{"class":151},"    local",[46,806,807],{"class":147}," message",[46,809,136],{"class":151},[46,811,813],{"class":812},"s4XuR","$1\n",[46,815,816,818,821,824,827,830],{"class":48,"line":300},[46,817,274],{"class":59},[46,819,820],{"class":63}," \"[$(",[46,822,823],{"class":88},"date",[46,825,826],{"class":63}," +%H:%M:%S)] ",[46,828,829],{"class":147},"$message",[46,831,196],{"class":63},[46,833,834],{"class":48,"line":383},[46,835,836],{"class":147},"}\n",[46,838,839],{"class":48,"line":627},[46,840,603],{"emptyLinePlaceholder":602},[46,842,843],{"class":48,"line":640},[46,844,845],{"class":52},"# Вызов\n",[46,847,849,851],{"class":48,"line":848},10,[46,850,796],{"class":88},[46,852,853],{"class":63}," \"Скрипт начался\"\n",[46,855,857],{"class":48,"line":856},11,[46,858,859],{"class":52},"# ... ваш код ...\n",[46,861,863,865],{"class":48,"line":862},12,[46,864,796],{"class":88},[46,866,867],{"class":63}," \"Скрипт завершён\"\n",[201,869,870,876],{},[204,871,872,875],{},[28,873,874],{},"local"," создаёт переменную, видимую только внутри функции.",[204,877,878,879,882,883,885,886,126],{},"Функции возвращают статус через ",[28,880,881],{},"return"," (число 0-255) или вывод через ",[28,884,60],{}," (строка). Для захвата вывода используйте ",[28,887,888],{},"result=$(function_name)",[20,890,892],{"id":891},"проверка-и-отладка","Проверка и отладка",[16,894,895],{},"Перед использованием в продакшене протестируйте скрипт:",[897,898,899,902,913,924],"ol",{},[204,900,901],{},"Запускайте с разными аргументами, включая граничные случаи (пустые строки, несуществующие файлы).",[204,903,904,905,908,909,912],{},"Используйте ",[28,906,907],{},"set -x"," в начале скрипта или запуск ",[28,910,911],{},"bash -x script.sh"," для пошагового вывода выполненных команд.",[204,914,915,916,919,920,923],{},"Добавьте ",[28,917,918],{},"set -e"," для автоматического выхода при ошибке любой команды и ",[28,921,922],{},"set -u"," для ошибки при использовании неопределённой переменной.",[204,925,926,927,126],{},"Проверяйте коды возврата команд: ",[28,928,929],{},"if ! command; then echo \"Ошибка\"; fi",[20,931,933],{"id":932},"типичные-ошибки-и-решения","Типичные ошибки и решения",[201,935,936,946,961,978,986,995],{},[204,937,938,942,943,126],{},[389,939,940],{},[28,941,117],{},": файл не исполняем. Решение: ",[28,944,945],{},"chmod +x script.sh",[204,947,948,953,954,957,958,126],{},[389,949,950],{},[28,951,952],{},"No such file or directory"," при запуске: проблема в shebang. Используйте ",[28,955,956],{},"#!/usr/bin/env bash"," вместо ",[28,959,960],{},"#!/bin/bash",[204,962,963,966,967,970,971,974,975,126],{},[389,964,965],{},"Синтаксическая ошибка в условии",": проверьте пробелы в ",[28,968,969],{},"[ ]"," — они обязательны: ",[28,972,973],{},"[ \"$a\" = \"b\" ]",", а не ",[28,976,977],{},"[\"$a\"=\"b\"]",[204,979,980,983,984,126],{},[389,981,982],{},"Пустые переменные в условиях",": всегда заключайте в кавычки: ",[28,985,529],{},[204,987,988,991,992,126],{},[389,989,990],{},"Потеря аргументов при вызове функции",": передавайте явно: ",[28,993,994],{},"my_func \"$@\"",[204,996,997,1000,1001,1003],{},[389,998,999],{},"Неверный подсчёт аргументов",": ",[28,1002,223],{}," считает аргументы после обработки оболочкой. Если передаётся строка с пробелами в кавычках, это один аргумент.",[20,1005,1007],{"id":1006},"дальнейшие-шаги","Дальнейшие шаги",[16,1009,1010],{},"Освоив основы, изучите:",[201,1012,1013,1025,1031,1047,1050],{},[204,1014,1015,1016,71,1019,71,1022,126],{},"Обработку текста через ",[28,1017,1018],{},"grep",[28,1020,1021],{},"awk",[28,1023,1024],{},"sed",[204,1026,1027,1028,126],{},"Планирование задач через ",[28,1029,1030],{},"cron",[204,1032,1033,1034,71,1037,71,1040,71,1043,1046],{},"Работу с потоками ввода-вывода (",[28,1035,1036],{},"\u003C",[28,1038,1039],{},">",[28,1041,1042],{},">>",[28,1044,1045],{},"|",").",[204,1048,1049],{},"Массивы и ассоциативные массивы в bash.",[204,1051,1052,1053,1056],{},"Отладку через ",[28,1054,1055],{},"trap"," и сигналы.",[16,1058,1059],{},"Эти инструменты расширят возможности ваших скриптов для сложных задач администрирования.",[1061,1062,1063],"style",{},"html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}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 .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":42,"searchDepth":56,"depth":56,"links":1065},[1066,1067,1068,1069,1070,1071,1072,1073],{"id":22,"depth":271,"text":23},{"id":129,"depth":271,"text":130},{"id":334,"depth":271,"text":335},{"id":533,"depth":271,"text":534},{"id":769,"depth":271,"text":770},{"id":891,"depth":271,"text":892},{"id":932,"depth":271,"text":933},{"id":1006,"depth":271,"text":1007},null,"2026-04-04 20:14:56","Научитесь писать bash-скрипты с нуля. Создавайте, запускайте и отлаживайте скрипты для автоматизации задач в Linux. Практические примеры переменных, условий и циклов внутри.","easy",false,"20 мин","md",[1082,1085,1088,1091],{"answer":1083,"question":1084},"`#!/usr/bin/env bash` — более переносимый вариант, он ищет bash в переменной PATH. `#!/bin/bash` жёстко задаёт абсолютный путь, что может не сработать на других системах.","Какой shebang выбрать: #!/bin/bash или #!/usr/bin/env bash?",{"answer":1086,"question":1087},"Используйте `set -e` для выхода при ошибке любой команды и `set -u` для ошибки при использовании неопределённой переменной. Ловите ошибки через `trap 'обработчик' ERR`.","Как правильно обрабатывать ошибки в bash-скрипте?",{"answer":1089,"question":1090},"`[[ ]]` — расширенный тест bash, он безопаснее (не требует экранирования `\u003C`, `>`), поддерживает `&&`, `||` и шаблоны (`== pattern`). Используйте `[[ ]]` в современных скриптах.","Чем отличается `[ ]` от `[[ ]]` в условиях?",{"answer":1092,"question":1093},"Используйте `\"$@\"` для передачи всех аргументов как отдельных слов или `\"$*\"` для одной строки. Для файлов можно вызвать скрипт как `./script.sh *.txt`.","Как передать в скрипт все файлы из текущей директории?",[1095,1098,1101,1104,1107],{"name":1096,"text":1097},"Создайте файл скрипта","Создайте файл с расширением .sh, например `myscript.sh`, в нужной директории.",{"name":1099,"text":1100},"Добавьте shebang","В первую строку файла добавьте `#!/usr/bin/env bash` для указания интерпретатора.",{"name":1102,"text":1103},"Напишите команды","Добавьте команды bash, которые нужно выполнить. Начинайте с простого `echo` для теста.",{"name":1105,"text":1106},"Сделайте файл исполняемым","В терминале выполните `chmod +x myscript.sh` для установки прав на выполнение.",{"name":1108,"text":1109},"Запустите скрипт","Запустите скрипт из его директории командой `./myscript.sh` или `bash myscript.sh`.","PT20M",[1112,1113,1114,1115,1116,1117,1118,1119,1120,1121,1122,125],"bash скриптинг для начинающих","как писать bash скрипты","bash скрипт примеры","основы bash linux","запуск bash скрипта","bash scripting tutorial","учить bash скрипты","bash script example","linux bash скрипты","bash команды","bash permission denied","ru_RU",{},"/guides/linux/bash-scripting-basics","linux",[1128,1129,1130],"/guides/linux/cron-jobs-basics","/guides/linux/awk-text-processing","/guides/linux/sed-basics","Гайды Linux",{"title":5,"description":1076},"guides/linux/bash-scripting-basics","Практическое руководство по основам bash-скриптинга. Вы освоите создание исполняемых скриптов, работу с переменными и аргументами, условные операторы, циклы и функции для автоматизации рутины в Linux.",[41,1126,1136,1137,1138,1139],"scripting","automation","cli","terminal","guide","dnn4uiuRJB7AJQZVImHhqGVua8iOgA3oJHhF6Lpu0Wo",{"data":1143,"body":1144},{},{"type":1145,"children":1146},"root",[1147],{"type":1148,"tag":16,"props":1149,"children":1150},"element",{},[1151,1157,1159,1164],{"type":1148,"tag":28,"props":1152,"children":1154},{"className":1153},[],[1155],{"type":1156,"value":956},"text",{"type":1156,"value":1158}," — более переносимый вариант, он ищет bash в переменной PATH. ",{"type":1148,"tag":28,"props":1160,"children":1162},{"className":1161},[],[1163],{"type":1156,"value":960},{"type":1156,"value":1165}," жёстко задаёт абсолютный путь, что может не сработать на других системах.",{"data":1167,"body":1168},{},{"type":1145,"children":1169},[1170],{"type":1148,"tag":16,"props":1171,"children":1172},{},[1173,1174,1179,1181,1186,1188,1194],{"type":1156,"value":904},{"type":1148,"tag":28,"props":1175,"children":1177},{"className":1176},[],[1178],{"type":1156,"value":918},{"type":1156,"value":1180}," для выхода при ошибке любой команды и ",{"type":1148,"tag":28,"props":1182,"children":1184},{"className":1183},[],[1185],{"type":1156,"value":922},{"type":1156,"value":1187}," для ошибки при использовании неопределённой переменной. Ловите ошибки через ",{"type":1148,"tag":28,"props":1189,"children":1191},{"className":1190},[],[1192],{"type":1156,"value":1193},"trap 'обработчик' ERR",{"type":1156,"value":126},{"data":1196,"body":1197},{},{"type":1145,"children":1198},[1199],{"type":1148,"tag":16,"props":1200,"children":1201},{},[1202,1208,1210,1215,1216,1221,1223,1229,1230,1236,1238,1244,1246,1251],{"type":1148,"tag":28,"props":1203,"children":1205},{"className":1204},[],[1206],{"type":1156,"value":1207},"[[ ]]",{"type":1156,"value":1209}," — расширенный тест bash, он безопаснее (не требует экранирования ",{"type":1148,"tag":28,"props":1211,"children":1213},{"className":1212},[],[1214],{"type":1156,"value":1036},{"type":1156,"value":71},{"type":1148,"tag":28,"props":1217,"children":1219},{"className":1218},[],[1220],{"type":1156,"value":1039},{"type":1156,"value":1222},"), поддерживает ",{"type":1148,"tag":28,"props":1224,"children":1226},{"className":1225},[],[1227],{"type":1156,"value":1228},"&&",{"type":1156,"value":71},{"type":1148,"tag":28,"props":1231,"children":1233},{"className":1232},[],[1234],{"type":1156,"value":1235},"||",{"type":1156,"value":1237}," и шаблоны (",{"type":1148,"tag":28,"props":1239,"children":1241},{"className":1240},[],[1242],{"type":1156,"value":1243},"== pattern",{"type":1156,"value":1245},"). Используйте ",{"type":1148,"tag":28,"props":1247,"children":1249},{"className":1248},[],[1250],{"type":1156,"value":1207},{"type":1156,"value":1252}," в современных скриптах.",{"data":1254,"body":1255},{},{"type":1145,"children":1256},[1257],{"type":1148,"tag":16,"props":1258,"children":1259},{},[1260,1261,1267,1269,1275,1277,1283],{"type":1156,"value":904},{"type":1148,"tag":28,"props":1262,"children":1264},{"className":1263},[],[1265],{"type":1156,"value":1266},"\"$@\"",{"type":1156,"value":1268}," для передачи всех аргументов как отдельных слов или ",{"type":1148,"tag":28,"props":1270,"children":1272},{"className":1271},[],[1273],{"type":1156,"value":1274},"\"$*\"",{"type":1156,"value":1276}," для одной строки. Для файлов можно вызвать скрипт как ",{"type":1148,"tag":28,"props":1278,"children":1280},{"className":1279},[],[1281],{"type":1156,"value":1282},"./script.sh *.txt",{"type":1156,"value":126},{"data":1285,"body":1286},{},{"type":1145,"children":1287},[1288],{"type":1148,"tag":16,"props":1289,"children":1290},{},[1291,1293,1299],{"type":1156,"value":1292},"Создайте файл с расширением .sh, например ",{"type":1148,"tag":28,"props":1294,"children":1296},{"className":1295},[],[1297],{"type":1156,"value":1298},"myscript.sh",{"type":1156,"value":1300},", в нужной директории.",{"data":1302,"body":1303},{},{"type":1145,"children":1304},[1305],{"type":1148,"tag":16,"props":1306,"children":1307},{},[1308,1310,1315],{"type":1156,"value":1309},"В первую строку файла добавьте ",{"type":1148,"tag":28,"props":1311,"children":1313},{"className":1312},[],[1314],{"type":1156,"value":956},{"type":1156,"value":1316}," для указания интерпретатора.",{"data":1318,"body":1319},{},{"type":1145,"children":1320},[1321],{"type":1148,"tag":16,"props":1322,"children":1323},{},[1324,1326,1331],{"type":1156,"value":1325},"Добавьте команды bash, которые нужно выполнить. Начинайте с простого ",{"type":1148,"tag":28,"props":1327,"children":1329},{"className":1328},[],[1330],{"type":1156,"value":60},{"type":1156,"value":1332}," для теста.",{"data":1334,"body":1335},{},{"type":1145,"children":1336},[1337],{"type":1148,"tag":16,"props":1338,"children":1339},{},[1340,1342,1348],{"type":1156,"value":1341},"В терминале выполните ",{"type":1148,"tag":28,"props":1343,"children":1345},{"className":1344},[],[1346],{"type":1156,"value":1347},"chmod +x myscript.sh",{"type":1156,"value":1349}," для установки прав на выполнение.",{"data":1351,"body":1352},{},{"type":1145,"children":1353},[1354],{"type":1148,"tag":16,"props":1355,"children":1356},{},[1357,1359,1365,1367,1373],{"type":1156,"value":1358},"Запустите скрипт из его директории командой ",{"type":1148,"tag":28,"props":1360,"children":1362},{"className":1361},[],[1363],{"type":1156,"value":1364},"./myscript.sh",{"type":1156,"value":1366}," или ",{"type":1148,"tag":28,"props":1368,"children":1370},{"className":1369},[],[1371],{"type":1156,"value":1372},"bash myscript.sh",{"type":1156,"value":126},[]]