Блог. Создание скрипта


Что такое "bash" или как создать(написать) script

 

Что же такое “bash” и как создаются скрипты. В этой статье мы разберем основы которые должен знать каждый linux-пользователь.

Что такое bash

Bash — это командный процессор, работающий, как правило, в интерактивном режиме в текстовом окне. Bash также может читать команды из файла, который называется скриптом (или сценарием). Как и все Unix-оболочки, он поддерживает автодополнение имён файлов и директорий, подстановку вывода результата команд, переменные, контроль за порядком выполнения, операторы ветвления и цикла. Ключевые слова, синтаксис и другие основные особенности языка были заимствованы из sh. Другие функции, например, история, были скопированы из csh и ksh. Bash в основном удовлетворяет стандарту POSIX, но с рядом расширений.

Название «bash» является акронимом от Bourne-again-shell («ещё-одна-командная-оболочка-Борна») и представляет собой игру слов: Bourne-shell — одна из популярных разновидностей командной оболочки для UNIX (sh), автором которой является Стивен Борн (1978), усовершенствована в 1987 году Брайаном Фоксом. Фамилия Bourne (Борн) перекликается с английским словом born, означающим «родившийся», отсюда: рождённая-вновь-командная оболочка.

Что такое script

Сценарный язык или script (язык сценариев, скриптовый язык, от англ. scripting language) — высокоуровневый язык сценариев (script) — кратких описаний действий, выполняемых системой. Сценарий — это программа, имеющая дело с готовыми программными компонентами.

Как создать script

Для создания скрипта не потребуется много усилий, но чтобы написать сценарий(программу), то потребуется изучать дополнительную литературу.

Мы рассмотрим самую основу написания скриптов, итак приступим, но если вы не знаете что такое терминал и как им пользоваться то вам сюда.

В самом начале чтобы писать скрипты нам нужно создать каталог для наших скриптов и файл куда мы будем все писать, для этого открываем терминал и создаем каталог

mkdir my_script

Переходим в только-что созданную директорию

cd my_script

И создаем файл

sudo gedit script.sh

у нас откроется текстовый редактор gedit, я люблю больше vim, но у вас он больше всего не будет установлен, поэтому показываю на стандартном.

Итак для того чтобы система понимала что используется bash, в начале файла нужно прописать

#!/bin/bash

и далее пишем команды которые хотите чтобы он выполнял. В моем примере я создам скрипт обновления системы, запишу в этот файл

sudo apt update;

sudo apt full-upgrade;

 

Сохраняем наш скрипт и закрываем

Так как права на запуск по-умолчанию отсутствуют то добавляем командой

chmod +x /home/fox/my_script/script.sh

Все наш скрипт готов, можно и запускать, но я бы хотел создать ярлык запуска, так же как и обычное приложение. Для этого идем в интернет и качаем любую png картинку, что соответствует нашему скрипту

Я нашел вот такую

Теперь переходим в директорию где у нас лежат ярлыки всех приложений

cd /usr/share/applications/

и создаем новый файл приложения

sudo gedit update_system.desktop

и прописываем такие строчки

[Desktop Entry]Name=Comment=GenericName=Keywords=Exec=Terminal=trueType=ApplicationIcon=Path=Categories=NoDisplay=false

Что все эти строки означают?

Name– имя приложения, которое будет отображаться под иконкой в Главном менюKeywords– слова, по которым будет искаться данный ярлык в Главном менюExec– строка запуска приложенияTerminal– (true или false)- запускать или нет приложение в окне терминалаType– определяет «раздел» в Главном меню, где будет находится ярлык приложенияIcon– путь к иконкеPath– путь к рабочему каталогу приложенияCategories– категории, к которым будет относится ярлык вашего приложения при выборе в Главном меню фильтров.NoDisplay(true или false)- Не отображать иконку в Главном меню(если true)

Заполняем обязательные поля

 

Сохраняем и закрываем

теперь ищем наше так называемое “приложение для обновления системы” в главном меню запускаем и вводим пароль

 

Как видим наш скрипт успешно отработал.

Для более углубленного изучения материала, прочтите статью “Написание скриптов на bash“.

А вот и видео, там все наглядно показано

Похожее

Автор публикации

707

Хотите писать статьи? Напишите мне в чат, и я предоставлю вам такую возможность.

Комментарии: 995Публикации: 779Регистрация: 10-06-2016

linuxthebest.net

Создание скрипта для публикации / Хабр

Время от времени появляется задача: сделать скрипт для публикации, который нужно обновлять но невозможно изменять. Например, это может быть скрипт инициализации, зашитый внутрь образа виртуальной машины или скрипт для установки движка сайта (публикуемый разработчиком движка).

В статье я расскажу о приемах, которые применяю для создания таких скриптов, они помогут избежать некоторых граблей, сохранить простоту и гибкость скриптов. Подход подойдет для тех скриптов, поведение которых должно меняться в зависимости от потребностей автора, обновлений и т.п. Подход НЕ подойдет для скриптов, которые должны работать автономно (без связи с системой автора).

Я использую такой подход в bash-скриптах, но общий принцип можно применять независимо от языка.

Короткая предистория (можно пропустить):
Несколько лет назад стал делать шаблоны VDS-серверов для массового использования клиентами. После создания шаблона поменять его уже не получится, т.е. единственный путь исправления ошибки: публикация нового шаблона, что стоит времени и много гигабайтов места (шаблон + его копии на всех серверах). За эти несколько лет получилось совершить несколько неудобных ошибок, в результате теперь еще много лет придется поддерживать шаблоны с неудобным поведением на старте.

Похожая ситуация может получиться и со скриптами установки/настройки панелей управления, движков сайтов, просто программ которые должны по одной команде скачаться, поставиться и настроиться. При том что сама программа может обновляться, а доступа к исправлению скрипта установки у всех кто его скачал раньше уже нет.

Часть из того что я использую было увидено в похожих скриптах, например установщики ispsystem, brew. Часть подсказали коллеги и часть нажита собственным горьким опытом.

Общая суть
Каждый раз загружать и выполнять весь код со своего сервера.
Общая структура кода
Публикуемый скрипт — только загружает первый файл исполняемого кода, больше ничего не делат. Первый файл исполняемого кода — сразу делает то что нужно (в простых случаях) или определяет что-то общее и загружает новые файлы Остальные файлы — организованы любым удобным образом, это можно будет менять уже в процессе работы.
Что должен делать и что должен НЕ делать публикуемый скрипт
Публикуемый скрипт ни в коем случае не должен выполнять ту задачу для которой он публикуется и даже не должен иметь намёка на её решение. Единственная задача этого скрипта — найти способ подключения к серверу разработчика и скачать оттуда код для выполнения. Этот код должен быть максимально простым с минимумом внешних зависимостей, т.к. их придется поддерживать всё время жизни скрипта. Вот код к которому я пришел в итогеfunction try() { # Выполнить команду, если вернулась ошибка - продолжать пробовать столько раз, сколько указано в первом параметре ... код немного громоздкий, опущен для упрощения } # Execute init.sh from panel function execute_init() { local EVAL_CODE=`curl http://panel.1gb.ru/minimal/init.sh` if [ "${EVAL_CODE#\#\!/bin/bash}" != "$EVAL_CODE" ] && [ "${EVAL_CODE%\#BashScriptEnd}" != "$EVAL_CODE" ]; then eval "$EVAL_CODE" return 0 else return 1 fi } try 100000 execute_init

Этот код я помещаю в шаблон с заранее известным окружением, в частности я точно знаю что там есть curl, а много попыток нужно т.к. при старте сервера сеть может не работать или http-сервер может временно выдавать ошибку. Другие скрипты могут работать в разных окружениях и curl там может не быть. Это хорошее место чтобы попробовать подключиться к серверу разными способами, при необходимости много раз.

Обязательно нужно проверить что код для выполнения загрузился целиком — длинная строка с if делает именно проверку: проверяется что скрипт начинается с #!/bin/bash и заканчивается #BashScriptEnd. Так можно быть уверенным, что не выполнится код HTML-ошибки или полскрипта, обрезав rm -rf /tmp/my-downloads до rm -rf /

Делать более сложные проверки я в этом месте не стал намеренно — TCP в данном случае дает приемлимую защиту от повреждения данных, а любое усложнение внешнего интерфейса потом придется поддерживать вечно.

У этого скрипта только одна внешняя зависимость — URL-адрес. В дальнейшем даже его потом пришлось поменять — при усовершенствовании организации кода, но зависимость настолько простая, что поддерживать её просто. Более того в новых скриптах тоже используется именно этот путь, сложившийся исторически, а не новый «правильный». Потому что в случае изменений в будущем пришлось бы поддерживать уже два URL и т.п.

В скрипте не должно быть никаких попыток определить окружение и загрузить например init_linux.sh или init_freebsd.sh вместо init.sh — такая попытка тоже была, оказалось что это неудобно и теперь приходится поддерживать заглушки для старых версию скриптов.

Что поместить в загружаемый скрипт
Тут свободы уже больше его можно будет менять не трогая уже опубликованной части. Так что если всё просто — сюда можно поместит сразу тот код который будет выполняться. Если что-то усложнится — это легко поменять в будущем.

При сложности выполняемого кода больше, чем 1 файл я рекомендую поместить сюда: 1. Функцию для загрузки новых файлов. Она заново определит как именно подключаться к серверу и во всех скриптах нужно использовать именно её. Она не подходит для общей библиотеки, т.к. та еще не загружена. 2. Вызвать эту функцию один/несколько раз для подключения и выполнения всех нужных файлов: общая библиотека кода, специфический код для найденного окружения и т.п. Может быть посмотреть какая команда передана в аргументах и подгрузить код для выполнения этой команды.

На что обратить внимание
  • Всегда проверять загруженный код перед выполнением. Иначе можно выполнить полскрипта или какую-то ошибку
  • В публикуемом скрипте минимум (в идеале одна) внешняя зависимость — адрес с которого загружается основной код. Всегда один и тот же
  • Всегда делать несколько попыток загрузить каждый файл. Даже если работа идет в локальной сети — могут быть временные ошибки сервера когда он вернет что-то не то, например ошибку. Или вообще подключение не примет. Если у вас один загружаемый файл и команды выполняются вручную — это может быть не страшно. Но если команды будут встроены в автоматику и подключаемых файлов много — вероятность что ошибка произойдет вполне реальна. Так же реальна и загрузка файла не целиком.
  • Перед публикацией скрипта обязательно его проверить — это обидно, когда опечатался в одном символе и из-за этого нужно переделывать кучу работы по подготовке/проверке шаблона или взаимодействовать с теми, кому недавно отдал скрипт
Недостатки и точка зрения на них
  • Необходимость подключения к сети (или интернету). В контексте применения этого подхода всё равно что-то придется скачивать с сервера разработчика (в т.ч. со своего если система используется внутри) и сеть всё равно потребуется. Скрипт не сможет настроить локальную сеть если она не работает или задать пароль доступа если не сможет его из сети получить. Так же скрипт не сможет развернуть ПО/сайт с сервера разработчика если он недоступен
  • Выполнение заранее неопределенного кода. Если это свой код, то всё понятно. Если это чей-то чужой код — всё равно это будет запускаться/выполняться на том уровне доверия который ему положен. Если это установка клиенского приложения — в клиентской среде и всё равно разработчик внутри своего ПО может делать что угодно и весь код проверять никто не будет (если кто-то будет — они врядли будут вообще использовать авторазвертывание со стороних ресурсов — только свои коды со своих серверов)

habr.com

Руководство по созданию скриптов для Bash

Ошибка базы данных: Table ‘a111530_forumnew.rlf1_users’ doesn’t exist

На главную -> MyLDP -> Электронные книги по ОС Linux

Руководство по Bash для начинающих
Глава 2: Пишем и отлаживаем скрипты
НазадВперед

Создание и запуск скрипта

Пишем скрипт и выбираем для него имя

Скрипт командной оболочки представляет собой последовательность команд, которую вы можете использовать многократно. Исполнение этой последовательности, как правило, осуществляется с помощью ввода в командной строке имени скрипта. Кроме того, с помощью cron вы можете использовать скрипты для автоматизации выполнения задач. Другое применение скриптов — процедура загрузки и остановки системы UNIX, когда в скриптах init определяются операции с демонами и сервисами.

Чтобы создать скрипт командной оболочки, откройте в вашем редакторе новый пустой файл. Для этого можно использовать любой текстовый редактор: vim, emacs, gedit, dtpad и т. д.; подойдет любой. Однако, вы можете выбрать более продвинутый редактор, такой как vim или emacs, поскольку такие редакторы можно настроить на распознавание синтаксиса командной оболочки и Bash и они могут оказаться хорошим подспорьем по предотвращению таких ошибок, которые часто делают новички, например, забывают закрывать скобки и ставить точки с запятой.

Подсвечивание синтаксиса в редакторе vim

Для того, чтобы активировать подсветку синтаксиса в редакторе vim, используйте команду

:syntax enable

или

:sy enable

или

:syn enable

Вы можете добавить этот параметр в файл для того, чтобы эта настройка стала постоянной.

Набирайте команды UNIX в новом пустом файле точно также, как если бы вы вводили их в командной строке. Как уже говорилось в предыдущей главе (смотрите раздел «Выполнение команды»), команды могут быть функциями командной оболочки, встроенными командами, командами UNIX или другими скриптами.

Выберите для вашего скрипта мнемоничное имя, которое бы говорило, что скрипт делает. Убедитесь, что имя вашего скрипта не конфликтует с существующими командами. Чтобы не возникало никакой путаницы, имена скриптов часто заканчиваются расширением .sh. Тем не менее, в вашей системе могут существовать и другие скрипты с тем же именем, которое вы выбрали. С помощью команд which, whereis и других поищите информацию об уже существующих программах и файлах в таким именем:

which -a script_name whereis script_name locate script_name (прим.пер.

Пишем скрипты в Linux (обучение на примерах)

: вместо укажите имя своего скрипта).

Скрипт script1.sh

В этом примере мы используем команду echo, встроенную в Bash, которая перед тем, как будут выданы выходные данные, проинформирует пользователя о том, что должно быть сделано. Настоятельно рекомендуется информировать пользователей о том, что делает скрипт с тем, чтобы пользователи не нервничали в случае, если им покажется, что скрипт ничего не делает. Мы вернемся к теме оповещения пользователей в главе 8 «Пишем интерактивный скрипт».

Рис.2.1. Скрипт script1.sh

Напишите такой же скрипт для себя. Хорошей идеей было бы создать директорий , в котором будут находиться ваши скрипты. Добавьте этот директорий к содержимому переменной :

export PATH=»$PATH:~/scripts»

Если вы только знакомитесь с Bash, используйте текстовый редактор, в котором для различных конструкций оболочки используются различные цвета. Подсветка синтаксиса поддерживается в vim, gvim, (x)emacs, kwrite и во многих других редакторах, смотрите документацию к вашему любимому редактору.

Различные строки приглашений

Строки приглашений, используемые в данном курсе, варьируются в зависимости от настроения автора. Это гораздо больше соответствует реальным жизненным ситуациям, чем стандартные строки приглашений $, используемые в учебных примерах. Единственное, чего мы будем придерживаться, это то, что строка приглашения для пользователя root будет заканчиваться символом диез (#).

Выполнение скрипта

Для того, чтобы скрипт можно было запускать, он должен для соответствующих пользователей иметь права на запуск. После того, как вы установите права доступа, проверьте, что вы действительно установили те права, которые вам нужны. Когда это будет сделано, скрипт можно будет запускать точно также, как и любую другую команду:

willy:~/scripts> chmod u+x script1.sh willy:~/scripts> ls -l script1.sh -rwxrw-r— 1 willy willy 456 Dec 24 17:11 script1.sh willy:~> script1.sh The script starts now. Hi, willy! I will now fetch you a list of connected users: 3:38pm up 18 days, 5:37, 4 users, load average: 0.12, 0.22, 0.15 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root tty2 — Sat 2pm 4:25m 0.24s 0.05s -bash willy :0 — Sat 2pm ? 0.00s ? — willy pts/3 — Sat 2pm 3:33m 36.39s 36.39s BitchX willy ir willy pts/2 — Sat 2pm 3:33m 0.13s 0.06s /usr/bin/screen I’m setting two variables now. This is a string: black And this is a number: 9 I’m giving you back your prompt now. willy:~/scripts> echo $COLOUR willy:~/scripts> echo $VALUE willy:~/scripts>

Это наиболее обычный способ выполнить скрипт. Предпочтительно выполнять скрипты, подобные этому, в подоболочке. Переменные, функции и псевдонимы, создаваемые в этой подоболочке, известны только в этой конкретной сессии bash в этой подоболочке. Когда происходит выход из этой оболочки и управление получает родительская оболочка, все настройки очищаются и будут забыты все изменения, которые были сделаны с помощью скрипта в состоянии этой оболочки.

Если вы в переменной не указали директорий или (текущий каталог), вы можете активировать скрипт следующим образом:

./script_name.sh

Также можно выполнить скрипт внутри имеющейся оболочки, но это обычно делается только в случае, если вы хотите получить специальные возможности, например, если нужно проверить, работает ли скрипт с другой оболочкой, или выдать трассировку с целью отладки (прим.пер. — вместо укажите имя своего скрипта ):

rbash script_name.sh sh script_name.sh bash -x script_name.sh

Указанная командная оболочка будет запущена как подоболочка вашей текущей оболочки и выполнит скрипт. Это делается, когда вы хотите, чтобы скрипт был запущен с конкретными параметрами или при определенных условиях, которые не указаны в самом скрипте.

Если вы не хотите запускать новую командную оболочку, а хотите выполнить скрипт в текущей оболочке, используйте команду :

source script_name.sh

source = .

Встроенная команда Bash source является синонимом команды . (точка), имеющейся в оболочке Bourne.

В этом случае скрипту не нужны права на выполнение. Команды выполняются в контексте текущей оболочки, так что любые изменения, которые сделаны в вашей среде, останутся видимыми, когда скрипт закончит выполнение:

willy:~/scripts> source script1.sh —output ommitted— willy:~/scripts> echo $VALUE 9 willy:~/scripts>

Если вам понравилась статья, поделитесь ею с друзьями:

Средняя оценка 1 при 1 голосовавших

Комментарии

steptosleep.ru