Как научиться создавать скрипты. Пишем скрипты в Linux (обучение на примерах)

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

Как уже неоднократно отмечалось, сценарий вставляется в HTML-код с помощью тега , который обычно размещается внутри тега заголовка . Это делается для того, чтобы код сценария загрузился прежде, чем страница будет выведена на экран. Сценарий можно разместить и в конце HTML-документа, чтобы элементы документа загрузились прежде, чем к ним будут применены операции сценария.

Для указания языка сценария служит атрибут LANGUAGE (язык). Если сценарий пишется на JavaScript, то атрибут LANGUAGE можно не указывать, поскольку JavaScript считается стандартным языком (по умолчанию). В браузере Internet Explorer версий с 4.0 по 6.0 можно также применять сценарии, написанные на VBScript. Если вы пишете на VBScript, то в качестве аргумента атрибута LANGUAGE следует задавать либо VBScript, либо VBS.

Вставка сценария в HTML-код осуществляется обычно по следующей схеме:



...


...

...

Здесь использован типовой вариант, при котором сценарий вставляется внутрь тега заголовка , хотя он может находиться влюбом месте HTML-кода. Иногда даже требуется, чтобы скрипт был загружен после загрузки некоторых элементов страницы.

Атрибут LANGUAGE тега может принимать аргументы JavaScript, JScript, VBScript и VBS. Если атрибут не указан, то подразумевается JavaScript.

Символы < ! - и //--> образуют тег комментария. Рекомендуется их использовать на тот случай, когда браузер пользователя не сможет интерпретировать сценарий. Например, браузеры Netscape не воспринимают скрипты на VBScript. Обратите внимание, что тег комментария в данном случае отличается от обычного тега комментария < ! >, используемого вне сценария для того, чтобы вставить поясняющие тексты, не отображаемые на экране.

Сценарий совсем необязательно размещать в том же HTML- документе, где он может понадобиться. Его можно разместить в отдельном обычном текстовом файле, но с расширением js, а в HTML-документе написать такую инструкцию:

Например:

Для определенности в тег не помешает вставить атрибут LANGUAGE= " JScript".

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

Связь между событием и функцией осуществляется в формате:

событие =" функция"

Например, если мы хотим связать событие «щелчок кнопкой мыши» с определенной нами функцией MyfuncQ, то должны использовать запись вида:

onclick="Myfunc ()"

Если вызов этой функции должен произойти при загрузке страницы в браузер, то следует записать:

onload=IMyfunc ()I

Мы рассмотрели связь типа «событие-функция». Однако одно и то же событие может восприниматься различными элементами страницы. Например, на щелчок кнопкой мыши могут отреагировать и кнопка, и картинка, и заголовок. Чтобы образовать связь «событие-функция-элемент», следует вставить запись типа событие="функция" в тег элемента страницы подобно вставке атрибута. Например, если мы хотим, чтобы функция Myfunc() вызывалась при щелчке на тексте, находящемся внутри тега , то надо написать:

Некоторый текст

Связь между событием и функцией может быть записана в большинстве тегов, например в , , , и др.

Возможен и другой, нестандартный способ связи «событие-функция-элемент». Он заключается в том, что в теге элемента страницы указывается атрибут ID (идентификатор, выполняющий роль имени NAME этого элемента, предназначенный для доступа к нему из программы). Затем в сценарии определяется функция, имя которой формируется по правилу:

идентификатор_элемента.событие()

Например, если мы хотим, чтобы при щелчке мышью на тексте, заключенном внутри тега , выполнялась некоторая функция, то мы должны написать примерно следующее:

....
Некоторый текст
....

....
function My.onclick()
....

....

Обратите внимание на связь между значением атрибута ID в теге элемента страницы и именем функции, определенной внутри тега сценария : значение ID и название события указываются в имени функции. В JScript эти составляющие имени пишутся через точку, а в VBScript - через символ подчеркивания. Приведенный выше фрагмент на языке VBScript выглядит так:

....
Некоторый текст
....

....
Sub My_onclick()
....

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

Обработчики событий

Обработчики событий следует оформлять в виде функций или процедур. В JScript используются только функции, а в VBScript - в основном, процедуры. Функция от процедуры отличается только тем, что возвращает некоторое значение. Следует различать описание (определение) функции и ее вызов.

Описание функции в JScript имеет вид:

function имя_функции (список_параметров)
{
... // код (тело) функции
};

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

return возвращаемый_результат

Если команда return не указана, то возвращается значение последнего вычисленного выражения. Следующий пример дает описание функции для вычисления площади прямоугольника:

function S_rectangle (a,b)
{
S=a*b;
return S
};

Для вычисления значения функции используется вызов:

имя_функции (список_значений_параметров)

Например, для вычисления площади прямоугольника со сторонами 5 и 20 следует записать выражение:

S = S_rectangle(5,20)

Здесь значение, возвращаемое функцией S_rectangle, присваивается переменной S. В вызове функций вместо конкретных значений можно подставлять переменные, функции и выражения. Вот пример:

х = 5;
S = S_rectangle(x,4+16)

Поскольку функция возвращает значение, ее вызов может участвовать в выражениях. Например, для вычисления площади прямоугольного треугольника с катетами а и b можно записать следующий код:

а = 5;
b = 20;
S_tr = 0.5*S_rectangle(a,b)

Впрочем, мы могли бы определить специальную функцию, вычисляющую площадь прямоугольного треугольника по его катетам:

function S_tr(a,b)
{
return 0.5*S rectangle(a,b)

Переменные

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


// Вычисление площади прямоугольного треугольника с помощью
// функции для площади прямоугольника
а = 5;
b = 20;
S_tr = 0.5*S_rectangle (a,b) // Вычисление площади
// прямоугольного треугольника.
function S_rectangle (a,b) // Описание функции
// вычисления площади прямоугольника.
{
S=a*b;
return S
}

Здесь все переменные доступны внутри функции S_rectangle () , но переменная S недоступна вне ее. Чтобы сделать переменную S доступной в любом месте скрипта, нужно просто создать ее вне функции. Например, можно записать выражение S = 0; в том месте скрипта, где определены переменные а и Ь.

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

Большинство похожих скриптов пишутся для удобства и автоматизации каких-либо действий на компьютере с ОС Windows. Представленные же ниже скрипты мало окажутся полезными (может мне так кажется), но они отлично подойдут для первоначального знакомства с "кодингом". Вы отлично проведете время, удивив как себя, так и знакомых чайников (не программистов), плюс это еще один хороший вариант .

Немного терминологии:

  • VBS - язык программирования для создания скриптов в ОС Windows, создается/редактируется в Блокноте Windows, имеет разрешение ".vbs". Думаю, продолжать не имеет смысла, ибо это мало о чем скажет, особенно новичкам. Интересующимся - .
  • BAT - пакетный файл, в народе просто "батник". Расширение файла ".bat". Дальше аналогично - .

Данных расширений (vbs, bat) файлы создаются во всеми известном Блокноте Windows (Notepad). Для большего удобства создания скриптов рекомендуется использовать усовершенствованный (скажем так) блокнот - Notepad++. Он удобен подсветкой синтаксиса большого количества языков программирования, если вам это мало о чем говорит, то скачайте и пишите в нем - ошибок сделаете меньше в коде, ну или будет их проще найти, чем в том же мало функциональном Блокноте Windows.

Для наглядности пример (слева - Блокнот Windows, справа - Notepad++):

Приступим

Если вы уже знакомы с VBS скриптами и батниками, то скорее всего нижеследующие примеры вам будут неинтересны, если же вы новичок, то для первоначального ознакомления - то, что нужно.

Научим компьютер здороваться

  • Открываем Блокнот (или Notepad Plus Plus).
  • Копируем в вставляем код:

    Set sapi=CreateObject("sapi.spvoice")
    sapi.Speak "Hello!"

  • Обязательное условие: кавычки должны быть “такими”, «ёлочки» не подойдут, скрипт не будет обрабатываться и выйдет ошибка. Вместо слова "Hello" можете написать что угодно, даже по русски, при наличии русского голосового движка.
  • Дальше выбираем Файл - Сохранить как - Тип файла - Все файлы - название.vbs
  • Называйте файл как хотите, но не забудьте в конце прописать расширение - .vbs (пример - Privet.vbs).
  • Теперь пробуйте проверить свой скрипт - запустите файл двойным щелчок мыши.
  • Один нюанс: если вы прописали в кавычках слова русскими буквами, а при запуске произносится непонятно что, то у вас просто не установлен русский голосовой движок. Подробная установка и настройка голосового движка выходит за рамки нашей статьи, поэтому более подробно ознакомьтесь и вновь возвращайтесь сюда.

    Теперь, сделаем следующее: пропишем данный скрипт в автозагрузку, а это означает то, что при запуске компьютера вам будет произнесено написанное в программе слово (слова), если как в примере, то будет говорить - "Hello" при каждом включении компьютера. Как это сделать?

    Все просто, программу (скрипт) добавить в автозагрузку можно таким же образом, то есть через такой же VBS скрипт. Создаем файл в блокноте, копируем/вставляем (Ctrl+C/Ctrl+V) следующий код:

    Dim vOrg, objArgs, root, key, WshShell
    root = "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run\"
    KeyHP = "Program"
    Set WshShell = WScript.CreateObject("WScript.Shell")
    WshShell.RegWrite root+keyHP,"C:\Privet.vbs /autorun"

    Изменяем путь до скрипта "говорилки", вот эту строчку - C:\Privet.vbs на свою. Прописываем где у вас лежит этот скрипт и как называется. Дальше сохраняем только что созданную мини программу в блокноте и запускаем. Все, теперь компьютер будет с вами здороваться пр каждом включении.

    Открыть дисковод

  • Открыть блокнот. Скопировать/Вставить следующий код:

    Set a = CreateObject("WMPlayer.OCX.7")
    Set b = a.CdromCollection
    Set c = b.Item(0)
    Set d = c.Eject

  • Сохранить с расширением.vbs
  • Запустить скрипт и откроется дисковод.
  • Есть более интересная модификация данного скрипта:

    Set WMPlayer = CreateObject("WMPlayer.OCX.7")
    do
    WMPlayer.CdRomCollection.Item(0).Eject()
    loop

    В данном случае будет все время открываться-закрываться CD/DVD-привод, на ноутбуках в этом случае будет открываться после каждого его закрытия.

    Внимание! Второй код (открытие-закрытие дисковода), некоторые антивирусы видят как вредоносную программу. Антивирус Касперского (в т.ч. и ) его видит именно так и уничтожает сразу же. В первом же случае (просто открытие дисковода) для антивирусных программ не является вредоносным скриптом.

    Чтобы прекратить автоматически открывать-закрывать дисковод необходимо:

  • Запустить диспетчер задач ( - Ctrl+Alt+Del).
  • Перейти на вкладку "Процессы".
  • Найти процесс wscript.exe - правая кнопка мыши - завершить процесс.
  • Игра

    Интересная находка из Сети - игра на VBS. Необходимо угадать число от 0 до 100. Скрипт автоматически при запуске задает (разгадывает) число, которое вам необходимо угадать и ввести в специальном окошке, при неправильном ответе даются подсказки, например меньше или больше.

    Ниже тот самый код который необходимо скопировать и вставить в блокнот, далее сохранить (расширение.vbs).

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

    Set y = CreateObject("Scripting.FileSystemObject")
    Set y = Nothing
    Do
    a = 0
    u = 0
    Randomize
    Number = Int((RND*99)+1)
    MsgBox "Я загадал число от 1 до 100, попробуй отгадать",64,"Угадайка"
    Do
    a = a + 1
    c = InputBox("Угадай число" & vbCrLf & vbCrLf & "Попытка: " & a & vbCrLf & vbCrLf & "Чтобы посмотреть результаты введите число!" & vbCrLf & vbCrLf & "Для выхода оставьте поле пустым" & vbCrLf & vbCrLf,"Угадайка")
    If c = "!" Then CreateObject("WScript.Shell").Run "notepad C:\Windows\Result.dll",3,True: Exit Do
    If c "" Then
    If IsNumeric(c) = True Then
    If CInt(c) < Number Then MsgBox "Нет,это не " & c & ". Я загадал число больше",64,"Угадайка"
    If CInt(c) > Number Then MsgBox "Нет,это не " & c & ". Я загадал число меньше",64,"Угадайка"
    If CInt(c) = Number Then
    Set y = CreateObject("Scripting.FileSystemObject")
    MsgBox ("Количество попыток: " & a)
    If MsgBox ("Правильно, это было число " & c & ". Начать заного?",36,"Угадайка") = 6 Then Exit Do Else WScript.Quit
    End If
    Else
    MsgBox "Это не число!",16,"Угадайка"
    a = a - 1
    End If
    Else
    a = a - 1
    l = MsgBox ("Ты ничего не ввел. Выйти из программы?",36,"Угадайка")
    If l = 6 Then WScript.Quit
    End If
    Loop
    loop

    Ну и перед тем как переходить к батникам (.BAT) воспользуемся самым полезным VBS скриптом из всех перечисленных в этой статье.

    Скрипт закрывающий wscript.exe

    Сам скрипт:

    Set TaskKill = CreateObject("WScript.Shell")
    TaskKill.Run "TaskKill /f /im wscript.exe"

    По сути он делает тоже самое, что чуть выше объяснялось в диспетчере задач, как например нельзя просто взять и закрыть надоедливый скрипт открывающий-закрывающий дисковод, а запустив данный скрипт все запущенные будут закрыты. Это как клин клином вышибают.

    Немного познакомились с VBS скриптами и о том как их писать в блокноте, теперь рассмотрим несколько примеров использования BAT файлов (далее - батник).

    Совсем простой батник состоящий всего из одной строки.

  • Открываем Блокнот.
  • Пишем следующий код:

    shutdown -s -t 1 -c -f

  • Далее Файл - Сохранить как - нзвание.bat
  • Обратите внимание на расширение файла, это уже не VBS скрипт, а батник, по этому в конце названия прописываем.bat (Пример compoff.bat).
  • Запускаем только что созданный батник двойным щелчком мыши и компьютер выключится (Завершение работы).
  • Есть такой вариант кода:

    shutdown -r -t 1 -c -f

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

    Удаление обновлений

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

    @echo
    echo
    echo Step 1: Delete Updates Telemetry
    wusa /uninstall /kb:3068708 /quiet /norestart
    wusa /uninstall /kb:3022345 /quiet /norestart
    wusa /uninstall /kb:3075249 /quiet /norestart
    wusa /uninstall /kb:3080149 /quiet /norestart

    Таким образом можно удалить абсолютно любое обновление, даже назойливое KB971033 которое проверяет .

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

    Правила написания скриптов

    Прежде всего надо рассмотреть тег . Этот тег служит для вставки скриптов в HTML-код страницы. Его формат:

    . . . Текст скрипта

    Текст скрипта помещаетс внутрь тега

    Атрибут language позволяет указать, на каком языке программирования написан скрипт.

    Значение по умолчанию - "JavaScript".

    Internet Explorer поддерживается скрипты, написанные на языке VBScript, которому соответствует значение атрибута "VBScript".

    Navigator позволяет задавать версию интерпретатора JavaScript:

    Это может пригодиться в случаях, когда вы используете возможность языка JavaScript, специфичную для какой-либо версии.

    В следующей таблице приведены версии интерпретатора JavaScript и соответствие их разным версиям Navigator:

    Второй атрибут src служит для задания адреса файла, содержащего скрипт.

    В этом случае обычно парный тег превращается в одинарный:

    js - стандартное расширение для JavaScript-файлов.

    Но что случиться, если Web-обозреватель не поддерживает скрипты? (Например, это слишком старая версия программы, или пользователь отключил поддержку скриптов в настройках безопасности.) Web-обозреватель проигнорирует тег и выведет на экран текст скрипта.

    Чтобы избежать этого, скрипт внутри тега рекомендуют заключать в комментарий.

    Однако некоторые версии Navigator в этом случае "не видят" скрипта, хотя, согласно техническим руководствам самой Netscape, должны. Так что этот совет применим только для Internet Explorer.

    В качестве альтернативы вы можете использовать тег .

    Этот тег поддерживается Internet Explorer и Navigator:

    . . . Текст, отображаемый, если Web-обозреватель неподдерживает скрипты

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

    Из книги Linux From Scratch автора Бикманс Герард

    Глава 7. Конфигурация загрузочных скриптов Введение Эта глава описывает конфигурацию скриптов, о которых было рассказано в 6 главе. Большинство из тех скриптов будут работать и без дополнительных настроек, но некоторые требуют дополнительной конфигурации, т.к. они

    Из книги Создание электронных книг в формате FictionBook 2.1: практическое руководство автора Кондратович Михаил Иосифович

    Что надо для загрузки loadkeys скриптов? Если вы решили вкомпилить вашу раскладку (keymap) напрямую в ядро, вернитесь в конец 6-й главы, где вам четко сказано, что не требуется его (скрипт) запускать, если вы уже вкомпилили раскладку (keymap) в ядро. Но вы можете запустить крипт если

    Из книги HTML 5, CSS 3 и Web 2.0. Разработка современных Web-сайтов. автора Дронов Владимир

    Конфигурация скриптов localnet. Частью установки скриптов, относящихся к localnet, является установка имени компьютера. Это требуется для правильной настройки /etc/sysconfig/network.Создайте файл /etc/sysconfig/network file и введите имя компьютера запустив следующее:echo «HOSTNAME=lfs» > /etc/sysconfig/network«lfs»

    Из книги Компьютерные советы (сборник статей) автора Автор неизвестен

    Настройка сетевых скриптов Эта часть нужна для настройки сетевой карты.Если у вас нет сетевой карты, вам не требуется создавать или настраивать файлы, относящиеся к сетевой карте. В этом случае удалите симлинк network из всех директорий (/etc/rc.d/rc*.d)Настройка шлюза по

    Из книги HTML 5, CSS 3 и Web 2.0. Разработка современных Web-сайтов автора Дронов Владимир

    § 4.6 Использование скриптов Автор FB Editor предусмотрел расширение его возможностей при помощи Java Script.Вызываются они из меню ToolsScripts[скрипт].Первые девять скриптов можно вызывать клавишами Ctrl+1…9.Документации, разумеется, не предусмотрено никакой. Во всем придется

    Из книги Ководство автора Лебедев Артём Андреевич Из книги Краткое введение в программирование на Bash автора Родригес Гарольд Из книги Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ автора Борри Хелен

    Правила написания выражений В процессе чтения этой главы мы изучили множество выражений JavaScript. Но так и не узнали, по каким правилам они пишутся. Настала пора восполнить пробел в наших знаниях.- Между операндами, операторами, вызовами функций и методов и ключевыми

    Из книги Мир InterBase. Архитектура, администрирование и разработка приложений баз данных в InterBase/FireBird/Yaffil автора Ковязин Алексей Николаевич

    § 163. Правила написания почтовых адресов 21 марта 2010Раньше реквизиты адреса принято было писать от большего к меньшему: страна, индекс, город, улица, дом, квартира, Васе Пупкину. В мире принята другая система составления адреса, потому что в мире отправляют много почты и

    Из книги Написание скриптов для Blender 2.49 автора Anders Michel

    Так все-таки программирование (programming) или написание скриптов (scripting)? Новичков в программировании, как правило, озадачивает разница между, собственно, программированием и языками скриптов. Программы, написанные на каких-то языках программирования, обычно гораздо более

    Из книги автора

    Что нужно знать для написания своих скриптов? Для этого необходимо знание основных команд Linux. Например, вы должны знать, как копировать, перемещать и создавать новые файлы. Обязательно умение использовать какой-либо текстовый редактор. Существуют три основных текстовых

    Из книги автора

    Переносимость ваших скриптов на bash При написании ваших собственных скриптов важно делать это так, чтобы они оставались переносимыми. Термин «переносимость» означает, что если ваш скрипт работает под Linux, то он должен работать в другой Unix-системе с малыми изменениями или

    Из книги автора

    Инструменты для написания фильтров API Firebird содержит группу макрофункций, начинающихся с isc_biob_fiiter_, которые являются "инструментом программиста" для написания фильтров BLOB. Документы API Guide и Embedded SQL Guide из набора документов Borland по InterBase версии 6 бета имеют разделы по

    Из книги автора

    Создание базы данных Employee с помощью скриптов После выполнения инсталляции Firebird база данных Employee будет создана и будет сделана ее резервная копия из скриптов. Скрипты empddl.sql (который создает метаданные) и empdll.sql (который заполняет базу данных) доступны в области Downloads на

    Из книги автора

    Использование скриптов в клиентских приложениях базы данных InterBase Время от времени у любого программиста появляется желание вынести часть логики своих приложений на уровень, который можно было бы изменять без перекомпиляции приложения. А для определенного класса задач

    Любой начинающий системный администратор Linux рано или поздно сталкивается с таким понятием, как “скрипт ”, будь то один из загрузочных скриптов вроде /etc/rc.d/rc или написанный разработчиком ПО скрипт конфигурирования configure . В данной статье я постараюсь показать, что написание скриптов на shell не является чем-то из ряда вон выходящим и вполне под силу даже новичку в мире Linux.

    Начнем с того, что разберем, что же скрывается за английскими терминами shell и скрипт . Shell , или оболочка, как этот термин иногда переводят - это командный интерпретатор, интерфейс между пользователем и операционной системой, ее ядром. Но, кроме этого, это еще и мощный язык программирования и написания сценариев. Он содержит свои служебные слова и управляющие конструкции и позволяет писать на нем программы. Такая программа на языке сценариев, называемая скриптом , может объединять в себе системные вызовы и команды операционной системы, а также внешние утилиты, создавая мощный инструмент для системного администрирования.

    Одной из задач системного администрирования является резервное копирование важной информации. Поэтому давайте рассмотрим пример скрипта, реализующего back-up информации.

    Начало начал

    Итак, прежде всего, нам необходимо разобраться в структуре скрипта. Она не представляет собой ничего сложного. По большому счету, простейший скрипт - просто перечисление системных команд. Например:

    Echo This is just example
    whoami
    uname -a

    Эти команды объединены в одном файле. Но shell должен знать, что он должен этот файл обработать, а не просто прочесть его содержимое. Для этого служит специальная конструкция: #!

    Эта конструкция называется «sha-bang ». Вообще-то, # задает комментарий, но в данном случает sha-bang означает, что после нее пойдет путь к обработчику скрипта. Напрмер:

    #!/bin/bash
    #!/bin/sh
    #!/usr/bin/perl

    Мы остановимся на Bash, Bourne-Again shell. Это shell устанавливается по умолчанию практически во всех Linux-системах, и /bin/sh ссылается на него. Об окончании скрипта говорит служебное слово exit.

    Вооружившись этими знаниями, напишем наш первый скрипт:

    #!/bin/bash
    echo Простой скрипт # Команда echo выводит сообщение на экран
    echo Вы:
    whoami # whoami показывает имя зарегистрированного пользователя
    echo Ваша система стартовала
    uptime # uptime показывает время включения машины
    echo Сегодня
    date # date показывает текущую дату и время
    echo Пока все
    exit

    Сохраним этот файл под именем tutor1.sh. Выполним команду чтобы сделать скрипт исполняемым.

    Chmod +rx tutor1.sh

    Результатом выполнения скрипта будет:

    Voland@superstar:~/Doc/Open Source$ ./tutor1.sh
    Простой скрипт
    Вы:
    voland
    Ваша система стартовала
    14:38:46 up 1:48, 2 users, load average: 0.47, 0.43, 0.41
    Сегодня
    Вск Фев 26 14:38:46 MSK 2006
    Пока все

    Переходим к более серьезному.

    Теперь, когда мы научились писать простейшие скрипты, самое время перейти к серьезным вещам: написанию скрипта для резервного копирования.

    Перво-наперво, необходимо определить - резервную копию чего мы будем делать. Поэтому наш скрипт должен уметь работать с командной строкой. Аргументы командной строки задаются после имени скрипта через пробел: somescript arg1 arg2 arg3. Скрипт воспринимает аргументы по номерам их следования, поэтому мы будем использовать конструкции вида $номер_аргумента, т.е. $1, $2, $3. $ - это символ подстановки, который нам понадобится и при работе с переменными. Переменные в скрипте задаются в виде имя_переменной=значение. Мы будем использовать переменные MAXPARAMS для определения максимального количества параметров командной строки, BACKUPFILE для задания имени архива, BACKUPDIR для папки, резервную копию которой мы будем делать и ARCHIVEDIR для папки, куды мы поместим архив. Самой главной частью скрипта будут команды поиска и архивации всех найденных файлов и папок в указанной:

    Find . -type f -print0 | xargs -0 tar rvf "$archive.tar" > /dev/null
    gzip $archive.tar

    Давайте разберемся, что же эти команды делают. find ищет в текущем каталоге (об этом говорит первый аргумент ".") все файлы и выдает полный путь к ним (print0). Эти пути перенаправляюся команде tar, которая собирает все файлы в один. Затем командой gzip мы архивируем получившийся tar-файл. Команда > /dev/null удобна, если вы архивируете большое количество файлов. В этом случае их имена и полный путь к ним не выводятся на консоль.

    Следующий шаг должен предусмотреть подсказки пользователю как пользоваться скриптом, если он допустит какие-то ошибки.

    Например, эта конструкция

    If [ $# -lt "$MAXPARAMS" ];
    then
    echo

    echo
    exit 0
    fi

    подскажет, что пользователь указал недостаточное количество аргументов командной строки. If [условие]...fi задает условную конструкцию. $# -lt "$MAXPARAMS" проверяет введенное количество параметров и если это число окажется меньше MAXPARAMS, то пользователю будет выдано сообщение об ошибочном вводе. Exit 0 заставит скрипт прекратить работу без указания кода ошибки. Аналогично проверяется превышение допустимого числа параметров, только вместо ls (less then - меньше, чем), необходимо указать gt (greater then - больше, чем). Теперь, когда основные моменты скрипта разъяснены, можно переходить к полной его версии:

    #!/bin/bash
    # Описание:
    #+ Делает резервную копию всех файлов в указанной директории
    #+ в "tarball" (архив tar.gz).
    #+ Использование:
    #+ sh backup.sh имя_архива папка-источник папка-назначение
    #+

    # Максимальное количество параметров командной строки
    MAXPARAMS=3

    if [ $# -lt "$MAXPARAMS" ];
    then
    echo
    echo "Использование: sh `basename $0` имя_архива папка-источник папка-назначение"
    echo
    exit 0
    fi

    if [ $# -gt "$MAXPARAMS" ];
    then
    echo
    echo "Для этого скрипта нужно только $MAXPARAMS аргументов командной строки!"
    echo
    exit 0
    fi

    # Переменные, которые мы используем в скрипте
    BACKUPFILE=$1-backup-$(date +%m-%d-%Y)
    archive=$BACKUPFILE
    BACKUPDIR=$2
    ARCHIVEDIR=$3

    # Проверяем, есть ли папка-источник и папка-назначение
    if [ ! -e $BACKUPDIR ];
    then
    echo
    echo "\"$BACKUPDIR\" не существует!"
    echo
    exit 0
    fi

    if [ ! -e $ARCHIVEDIR ];
    then
    echo
    echo "\"$ARCHIVEDIR\" не существует, создаем..."
    mkdir $ARCHIVEDIR
    echo "Готово."
    fi

    # Проверяем, есть ли архивы в источнике и назначении.
    cd $ARCHIVEDIR
    if [ -e $archive.tar.gz ];
    then rm $archive.tar.gz
    fi

    cd $BACKUPDIR
    if [ -e $archive.tar.gz ];
    then rm $archive.tar.gz
    fi

    # Главная часть скрипта...
    echo "Делаем резервную копию \"$BACKUPDIR\" в файл \"$archive.tar.gz\"..."
    find . -type f -print0 | xargs -0 tar rvf "$archive.tar" > /dev/null
    gzip $archive.tar
    echo "\"$BACKUPDIR\" была успешно заархивирована в файл \"$archive.tar.gz\"."

    # Перемещаем архив в папку ARCHIVEDIR
    echo "Перемещаем архив \"$archive.tar.gz\" в папку \"$ARCHIVEDIR\"."
    mv $archive.tar.gz $ARCHIVEDIR/$archive.tar.gz
    echo "Готово."

    Надеюсь, основные моменты я прокомментировал достаточно подробно. Если у вас возникли какие-либо вопросы, то вы можете связаться со мной по адресу [email protected] Рекомендую также замечательную книгу Advanced Bash-Scripting Guide Менделя Купера (Mendel Cooper), которая очень помогла мне в свое время, когда я только знакомился со скриптами. Удачного программирования.

    P.S. Большое спасибо mar за ее замечания и советы.

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

    ———————————————————————————-

    1. Введение

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

    Зачем нужны скрипты
    Во-первых, администрирование linux-сервера в той или иной степени сводится к систематическому выполнению одних и тех же команд. Причем не обязательно, чтобы эти команды выполнял человек. Их можно запрограммировать на выполнение машиной.
    Во-вторых, даже просто выполнение обычной задачи, которая (вдруг) составляет 20-1000… однообразных операций ГОРАЗДО проще реализовать в скрипте.

    Что такое скрипт
    Скрипт — набор инструкций, которые должен в определенном порядке и в определенное время выполнить компьютер. Инструкциями могут быть как внутренние команды оболочки (циклы, условия, обработка текстовой информации, работа с переменными окружения и прочее), так и любая программа, выполняемая нами в консоли с необходимыми параметрами.

    Как писать скрипт
    В нашем случае скрипт будет представлять из себя текстовый файл с атрибутами выполнения. Если файл сценария начинается с последовательности #!, которая в мире UNIX называется sha-bang, то это указывает системе какой интерпретатор следует использовать для исполнения сценария. Если это трудно понять, то просто запомните, что все скрипты мы будем начинать писать именно со строчки #!/bin/bash или #!/bin/sh, а далее пойдут команды и комментарии к ним.

    Напутствие
    Я Вам искренне советую писать как можно больше комментариев чуть ли ни к каждой строчке в скрипте. Пройдет время и Вам понадобится изменить или модернизировать написанный когда-то скрипт. Если не помнишь или не понимаешь, что написано в скрипте, то становится сложно его изменять, проще писать с нуля.

    Какие скрипты могут нам понадобиться:

      устанавливающий правила файервола при загрузке системы.
      выполняющий backup настроек и данных.
      запускающий в определенное время (лучше каждую ночь) программу, которая сканирует логи прокси-сервера и выдает удобный web-отчет по количеству скачанного трафика.
      отправляющий нам на почту информацию о том, что кто-то получил доступ к нашему серверу по ssh, время подключения и адрес клиента.

    О методике написания скриптов
    Создаем текстовый файл, редактируем его, устанавливаем права на выполнение, запускаем, смотрим ошибки, исправляем, запускаем, смотрим ошибки…
    Когда все вылизано и работает правильно, ставим его в автозагрузку либо в планировщик на определенное время.

    ———————————————————————————-

    2. Обучение написанию сценариев на внутреннем языке BASH
    оригинал: https://www.linuxconfig.org/Bash_scripting_Tutorial

    Это руководство предполагает отсутствие предварительных знаний о методике написания сценариев (далее скриптов) с помощью внутреннего языка Bash. С помощью данного руководства вы обнаружите в скором времени, что написание скриптов очень простая задача. Давайте начнем наше обучение с простого сценария, выполняющего вывод строки «Hello World!» (в перев. с англ. — Всем привет!)

    1. Сценарий «Всем привет»
    Вот ваш первый пример bash-скрипта:

    #!/bin/bash
    echo «Hello World»

    Переходим в директорию, содержащую наш файл hello_world.sh и делаем его исполняемым:

    Код: Выделить всё $ chmod +x hello_world.sh

    Запускаем скрипт на выполнение

    Код: Выделить всё $ ./hello_world.sh

    2. Простой архивирующий bash-скрипт

    #!/bin/bash
    tar -czf myhome_directory.tar.gz /home/user

    Код: Выделить всё $ ./backup.sh

    $ du -sh myhome_directory.tar.gz
    41M myhome_directory.tar.gz

    3. Работа с переменными
    В данном примере мы объявляем простую переменную и выводим её на экран с помощью команды echo

    #!/bin/bash
    STRING=»HELLO WORLD!!!»
    echo $STRING

    Код: Выделить всё $ ./hello_world.sh
    HELLO WORLD!!!

    Наш архивирующий скрипт с переменными:

    #!/bin/bash
    OF=myhome_directory_$(date +%Y%m%d).tar.gz
    IF=/home/user
    tar -czf $OF $IF

    Код: Выделить всё $ ./backup.sh
    tar: Removing leading "\" from member names
    $ du -sh *tar.gz
    41M myhome_directory_20100123.tar.gz

    3.1 Глобальные и локальные переменные

    #!/bin/bash
    # Объявляем глобальную переменную
    # Такая переменная может использоваться в любом месте этого скрипта
    VAR=»global variable»
    function bash {
    # Объявляем локальную переменную
    # Такая переменная действительна только для функции, в которой её объявили
    local VAR=»local variable»
    echo $VAR
    }
    echo $VAR
    bash
    # Обратите внимание, что глобальная переменная не изменилась
    echo $VAR

    Код: Выделить всё $ ./variables.sh
    global variable
    local variable
    global variable

    4. Передаем аргументы в скрипт

    #!/bin/bash
    # Используйте предопределенные переменные для доступа к аргументам
    # Выводим аргументы на экран
    echo $1 $2 $3 ‘ -> echo $1 $2 $3’

    #Мы так же можем получить доступ к аргументам через специальный массив args=(«$@»)
    # Выводим аргументы на экран
    echo ${args} ${args} ${args} ‘ -> args=(«$@»); echo ${args} ${args} ${args}’

    # Используйте переменную $@ для вывода всех аргументов сразу
    echo $@ ‘ -> echo $@’

    Используйте переменную $# для вывода количества переданный в скрипт аргументов
    echo Number of arguments passed: $# ‘ -> echo Number of arguments passed: $#’

    Код: Выделить всё $ ./arguments.sh Bash Scripting Tutorial
    Bash Scripting Tutorial -> echo $1 $2 $3
    Bash Scripting Tutorial -> args=("$@"); echo ${args} ${args} ${args}
    Bash Scripting Tutorial -> echo $@
    Number of arguments passed: 3 -> echo Number of arguments passed: $#

    5. Выполнение в скрипте команд оболочки

    #!/bin/bash
    # используйте обратные кавычки » ` ` » для выполнения команды оболочки
    echo `uname -o`
    # теперь попробуем без кавычек
    echo uname -o

    Код: Выделить всё $ uname -o
    GNU/Linux
    $ ./bash_backtricks.sh
    GNU/Linux
    uname -o

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

    6. Читаем пользовательский ввод (интерактивность)

    #!/bin/bash
    echo -e «Hi, please type the word: \c »
    read word
    echo «The word you entered is: $word»
    echo -e «Can you please enter two words? »
    read word1 word2
    echo «Here is your input: \»$word1\» \»$word2\»»
    echo -e «How do you feel about bash scripting? »
    # read command now stores a reply into the default build-in variable $REPLY
    read
    echo «You said $REPLY, I’m glad to hear that! »
    echo -e «What are your favorite colours ? »
    # -a makes read command to read into an array
    read -a colours
    echo «My favorite colours are also ${colours}, ${colours} and ${colours}:-)»

    Код: Выделить всё $ ./read.sh
    Hi, please type the word: something
    The word you entered is: something
    Can you please enter two words?
    Debian Linux
    Here is your input: "Debian" "Linux"
    How do you feel about bash scripting?
    good
    You said good, I"m glad to hear that!
    What are your favorite colours ?
    blue green black
    My favorite colours are also blue, green and black:-)

    7. Использование ловушки

    #!/bin/bash
    # объявляем ловушку
    trap bashtrap INT
    # очищаем экран
    clear;
    # функция ловушки выполняется, когда пользователь нажимает CTRL-C:
    # На экран будет выводиться => Executing bash trap subrutine !
    # но скрипт будет продолжать выполняться
    bashtrap()
    {
    echo «CTRL+C Detected !…executing bash trap !»
    }
    # скрипт будет считать до 10
    for a in `seq 1 10`; do
    echo «$a/10 to Exit.»
    sleep 1;
    done
    echo «Exit Bash Trap Example!!!»

    Код: Выделить всё $ ./trap.sh
    1/10
    2/10
    3/10
    4/10
    5/10
    6/10

    7/10
    8/10
    9/10
    CTRL+C Detected !...executing bash trap !
    10/10
    Exit Bash Trap Example!!!

    Как видим, сочетание клавишь Ctrl-C не остановило выполнение скрипта.

    8. Массивы
    8.1 Объявляем простой массив

    #!/bin/bash
    # Объявляем простой массив с 4 элементами
    ARRAY=(‘Debian Linux’ ‘Redhat Linux’ Ubuntu Linux)
    # Получаем количество элементов в массиве
    ELEMENTS=${#ARRAY[@]}

    # выводим в цикле каждый элемент массива
    for ((i=0;i

    Есть вопросы?

    Сообщить об опечатке

    Текст, который будет отправлен нашим редакторам: