Написание скриптов оболочки (shell scripting) - Видеоуроки. Shell scripting самоучитель


Linux и UNIX: программирование в shell. Руководство разработчика.

Настоящая книга посвящена shell–программированию, или, точнее, программированию в интерпретаторе Bourne shell.

Программирование на языке интерпретатора shell приобретает все большую популярность по мере утверждения Linux в качестве удобной в работе и отказоустойчивой операционной системы. Трудно оценить, какое количество пользователей работают с Linux. Эта операционная система распространяется бесплатно, хотя многие компании разрабатывают ее коммерческие варианты. Кроме того, несмотря на сделанные несколько лет назад неутешительные прогнозы специалистов относительно будущего UNIX, данная ОС также не теряет популярности, и число ее приверженцев продолжает расти.

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

При написании книги во внимание принимались шесть основных положений:

   • читатель должен быстро освоить инструментальные средства интерпретатора shell, а также изучить основы программирования на языке shell;

Интерпретатор bourne shell

Bourne shell является стандартным интерпретатором команд, который входит в состав всех систем UNIX и совместим с интерпретатором bash в Linux. В книге, посвященной shell–программированию и не привязанной к конкретной операционной системе, в качестве общего знаменателя должен рассматриваться именно Bourne shell. Учтите, что существуют и другие интерпретаторы, такие как bash, Korn shell и С shell. Если в вашей системе установлен интерпретатор bash, сценарии из этой книги будут выполняться в нем, поскольку bash совместим с Bourne shell. Синтаксис интерпретатора Korn shell близок к синтаксису рассматриваемого здесь языка.

Если внимательно изучить сценарии системной инсталляции, то можно обнаружить, что более чем на 95 процентов они являются сценариями Bourne shell. Это объясняется тем, что создатели сценариев знали: они будут выполняться в любой системе UNIX и Linux.

Переносимость интерпретатора shell

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

Проблемы, связанные с первым фактором, решаются автоматически, если сценарии создаются для интерпретатора Bourne shell.

Что касается второго фактора, то для большинства shell–сценариев характерна следующая особенность: по крайней мере, 20 процентов (а то и больше) их рабочего времени затрачивается на выполнение таких shell–команд, как cp, mv, mkdir и др. Здесь и заключена проблема переносимости. Дело в том, что поставщики разных операционных систем оснащают эти команды различными наборами опций. В нашей книге используются сценарии общего характера и применяются только те опции и команды, которые присутствуют как в System V, так и в BSD. Если же имеются какие‑либо различия, то приводятся альтернативные команды, но это случается сравнительно редко.

Структура книги

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

Книга состоит из пяти частей, посвященных различным аспектам программирования на языке интерпретатора shell.

Интерпретатор shell

В первой части книги рассматриваются общие вопросы, связанные с работой в интерпретаторе shell.

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

Чтобы на поиск созданного вами файла не уходило много времени, прочитайте

главу 2, посвященную команде find .

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

litresp.ru

Shell Учебники

Shell является программа, написанная на языке C, то пользователю использовать Linux мост. Shell является как командный язык является языком программирования.

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

ш Кен Томпсон является первым Unix Shell, Windows Explorer представляет собой типичный графический интерфейс оболочки.

Shell онлайн - инструменты

Shell Scripting

Shell скриптов (сценариев оболочки), является своего рода скриптов, написанных.

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

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

Shell Environment

Программирование Shell с Java, PHP программирования, до тех пор, как можно писать код в текстовом редакторе и интерпретатора скриптов, чтобы объяснить реализацию этого.

Shell много разновидностей системы Linux являются общими:

  • Bourne Shell (/ USR / бен / ш или / бен / ш)
  • Bourne Again Shell (/ bin / Баш)
  • C Shell (/ USR / бен / CSH)
  • K Shell (/ USR / бен / КШ)
  • Оболочка для корневой (/ SBIN / ш)
  • ......

Этот учебник касается Bash, это Bourne Again Shell, благодаря простоте использования и бесплатно, Bash широко используется в повседневной работе. В то же время, Bash по умолчанию для большинства систем Linux Shell.

В общем, люди не проводят различия между Bourne Shell и Bourne Again Shell, так что , как #! / Bin / ш, он также может быть изменен на #! / Bin / баш.

#! Тогда скажите системный путь, указанный в программе, которая истолковывается Shell Этот файл сценария.

Первый сценарий оболочки

Откройте текстовый редактор (вы можете использовать VI / Vim команду для создания файла), создайте новый файл test.sh, расширение ш (ш имени оболочки), расширение не влияет на выполнение сценария, см имя EENOW как, если вы писать скрипты с расширением PHP, PHP на использование хорошо.

Введите код, первая линия, как правило, следующим образом:

"#!" Является ли соглашение тег, который указывает системе, что интерпретатор скриптов для выполнения, то есть, какой из них использовать Shell.

эхо-команда используется для вывода текста в окне.

Запуск сценария оболочки двумя способами:

1, в качестве исполняемой программы

Сохраните приведенный выше код как test.sh и компакт-диска в соответствующий каталог:

chmod +x ./test.sh #使脚本具有执行权限 ./test.sh #执行脚本

Внимание должно быть написано ./test.sh, вместо test.sh, бег и другие двоичные программы, тоже писать прямо test.sh, Linux системы будет идти туда в поисках PATH называется test.sh, и только / бен , / SBIN, / USR / бен, / USR / SBIN и так далее в PATH, текущий каталог, как правило, не на пути, он не найдет написана команда test.sh говорит системе использовать ./test.sh сказать , чтобы найти в текущем каталоге.

2, в качестве объяснительной параметра

Этот режим запускается непосредственно интерпретатор, его параметр имя файла сценария оболочки, такие как:

/bin/sh test.sh /bin/php test.php

Этот скрипт запускается, первая строка не требуется указывать информацию интерпретатора, писать бесполезно.

www.w3big.com

Написание скриптов оболочки (shell script)

Shell scripting: Discover how to automate command line tasks

Duration 01:57:39

Открыть все курсы от udemy

Shell scripting: Discover how to automate command line tasks - Полный список уроков

Развернуть / Свернуть
  • Урок 1. Course Overview 00:01:38
  • Урок 2. Course Downloads Including the scripts used in the course and a cheat sheet 00:01:03
  • Урок 3. Section Introduction 00:00:49
  • Урок 4. Shell Scripting Part I 00:08:38
  • Урок 5. Shell Scripting Part II 00:07:11
  • Урок 6. Exit Statuses and Return Codes 00:08:52
  • Урок 7. Exit Status Demo 00:05:56
  • Урок 8. Functions Part I 00:07:18
  • Урок 9. Functions Part II 00:04:48
  • Урок 10. Review 00:00:27
  • Урок 11. Shell Script Checklist and Template Video 00:01:59
  • Урок 12. Introduction to Wildcards 00:00:23
  • Урок 13. Wildcard Introduction Part I 00:05:12
  • Урок 14. Wildcard Introduction Part II 00:07:03
  • Урок 15. Wildcards in Shell Scripts 00:03:42
  • Урок 16. Wildcard Scripting Demo 00:04:01
  • Урок 17. Case Statements 00:05:43
  • Урок 18. Logging 00:07:40
  • Урок 19. While Loops Part I 00:05:42
  • Урок 20. While Loops Part II 00:05:48
  • Урок 21. Debugging Essentials 00:08:08
  • Урок 22. More Debugging Tips 00:11:39
  • Урок 23. Scripts Used to Create This Course 00:03:59

То, что вы узнаете в этом курсе, может быть применено к любой оболочке, однако основное внимание уделяется оболочке bash и некоторым действительно продвинутым функциям bash. Опять же, используете ли вы bash, bourne (sh), KornShell (ksh), C shell (csh), Z shell (zsh) или даже оболочку tcsh, вы все равно научитесь грамотно писать свои оболочки.

  • Темы затронутые в этом курсе:
  • -Пошаговый процесс написания сценариев оболочки, которые решают важные проблемы;
  • -Первое что нужно делать каждый раз при создании скрипта оболочки;
  • -Как быстро найти и исправить наиболее распространенные ошибки сценариев оболочки;
  • -Как принимать входные данные от пользователя, а затем принимать решения по этому вводу;
  • -Как принимать и обрабатывать аргументы командной строки;
  • -Какие специальные переменные доступны? Как и когда их использовать в сценариях оболочки?
  • -Проверочный список сценариев оболочки - вам никогда не придется угадывать, что включать в каждый из ваших сценариев оболочки снова. Просто используйте контрольный список;
  • -Реальные примеры сценариев оболочки из личной коллекции автора курса;
  • -Загрузка содержащая скрипты используемые в презентациях и уроках. Вы сможете смотреть и экспериментировать со всем, что вы изучаете;
  • -Тесты после каждого раздела, чтобы убедиться, что вы изучаете наиболее важные аспекты сценариев оболочки.

Твоя оценка

Следи за последними обновлениями и новостями в наших пабликах facebook, или вступай в наш канал telegram.

Комментарии

coursehunters.net

10 секундное руководство по Bash Shell Scripting

Общие переменные окруженияPATH - Устанавливает путь поиска для любой исполняемый командой. Аналогично переменной PATH в MSDOS.HOME - домашний каталог пользователя.MAIL - Содержит путь к месту хранрения почты пользователя.IFS - Содержит строку символов, которые используются как разделители в командной строке. Строка, как правило, состоит из пробела, табуляции и символы новой строки. Чтобы увидеть их придется сделать восьмеричный дамп следующим образом:

$ echo $IFS | od -bc

PS1 и PS2 - Основное и вторичное приглашение в bash. PS1 устанавливается $ по умолчанию и PS2 установлен в '>'. Чтобы увидеть вторичное, просто запустите команду:

$ $ ls |

... и нажмите ввод.

USER - имя пользователя для входа.TERM - обозначает тип терминала который используется. Должно быть настроены правильно для редакторов типа vi для правильной работаты.SHELL - определяет тип оболочки, которую видит пользовательпри входе в систему.Примечание: Чтобы узнать какие значения имеют проведенные выше переменные окружения, выполните команду echo c именем переменной начинающиееся с $. Например:

$ echo $USERravi

... получаем значение хранящееся в переменной USER.

Некоторые bash shell scripting правила1) В первой строке вашего скрипта должено быть

#!/bin/bash

... то есть сначала #, затем !, затем путь до оболочки. Эта линия позволяет узнать расположение файла оболочки.

2) Перед выполнением скрипта, вы должны сделать скрипт исполняемым. Делается это следующей командой:

$ chmod ugo+x your_shell_script.sh

3) Обычно скрипт имеет расширение .sh. Это позволяет пользователю понять, что файл является скриптом.

Условные выраженияВыражение 'if'

:

if condition_is_truethenexecute commandselseexecute commandsfi

if также позволяет ветвления. То есть вы можете оценить несколько условий, если предыдущие условия отклонены.

if condition_is_truethenexecute commandselif another_condition_is_truethenexecute commandselseexecute commandsfi

Пример:

if grep "linuxhelp" thisfile.htmlthenecho "Found the word in the file"elseecho "Sorry no luck!"fi

if дополняется - test Тест оценит выражение справа, и возвращает либо верно или неверно. Для этого используется следующие операторы:

Операторы сравнения

-eq Равно-le Меньше или равно

Тест файлов ж-файл р-файл ж-файл - х файл - д файл ы-файл True если файл существует и имеет размер больше чем ноль.

-f file True если file существует и является обычным файлом-r file True если file существует и доступен для чтения-w file True если file существует и доступен на запись-x file True если file существует и является исполняемым-d file True если file существует и является каталогом-s file True если файл существует и имеет размер больше чем ноль.

Тестирование строк

-n str True, если строка str не равна null-z str True, если строка str равна nullstr1 == str2 True если обе строки равныstr1 != str2 True если строки не равныstr True, если строке str присвлено значениеи не равно null

Тест также позволяет проверять более одного выражения в одной строке.

-a Аналогично AND-o Аналогично OR

Пример:

test $d -eq 25 ; echo $d

... что означает, если значение в переменной d равено 25, в выводим значение.

test $s -lt 50; do_something

 

if [ $d -eq 25 ]thenecho $dfi

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

if [ $str1 == $str2 ]then do somethingfi

if [ -n "$str1" -a -n "$str2" ]then echo 'Both $str1 and $str2 are not null'fi

... если обе строки не являются равными null затем выполняем команду echo. Несколько вещей, которые нужно помнить при использовании test Если вы используете квадратные скобки [], вместо test, то необходимо вставить пробел после [ и перед ]. Примечание: test проверяет только целые значения. Дробные просто усекаются. Не используйте маски для тестирования равенства строки.

Выражение case Case является вторым условным выражением поддерживаемым оболочкой. Синтаксис:

case expression inpattern1) execute commands ;;pattern2) execute commands ;;...esac

Ключевыми словами здесь являются case и esac. ';;' используется в качестве окончания вариант. Также использует ')', чтобы отделить шаблон от действий. Пример:

...echo "Enter your option : "read i;

case $i in 1) ls -l ;; 2) ps -aux ;; 3) date ;; 4) who ;; 5) exitesac

Примечание: В последнем случае ;; не требуется, но если хотите, то можете их поставить. Вот еще один пример:

case `date |cut -d" " -f1` in Mon) commands ;; Tue) commands ;; Wed) commands ;; ...esac

Case также поддерживает в выражении более чем один шаблон в каждом варианте. Вы также можете использовать wild-cards для сопоставления шаблонов.

...echo "Do you wish to continue? (y/n)"read ans

case $ans in Y|y) ;;[Yy][Ee][Ss]) ;; N|n) exit ;;[Nn][Oo]) exit ;; *) echo "Invalid command"esac

В приведенном случае, если вы введете Yes, YES, yEs и любую их комбинацию, то значение будет найдено.

Циклы Цикл whileСинтаксис:

while condition_is_truedo execute commandsdone

Пример:

while [ $num -gt 100 ]do sleep 5done

while :do execute some commandsdone

Выше код реализует бесконечный цикл. Вы также можете написать 'в то время как справедливо' вместо 'а:'. Здесь я хотел бы ввести два ключевых слова в связи с looping условные. Они перерыв и продолжить. Перерыв - Это ключевое слово вызывает контроль вырваться из петли. далее - Это ключевое слово будет приостанавливать исполнение всех заявлений после него и выключатели контроль верхней части петли для следующей итерации. Цикл untilЦикл выполняется пока выражение не станет ложным. Синтаксис:

until falsedo execute commandsdone

Пример:

...until [ -r myfile ]dosleep 5done

Вышеуказанный код выполняется повторно до тех пор, пока файл myfile может быть прочитан. Цикл forСинтаксис:

for variable in listdoexecute commandsdone

Пример:

...for x in 1 2 3 4 5do echo "The value of x is $x";done

Выводистя пять чиесл от 1 до 5. Вот еще один пример:

for var in $PATH $MAIL $HOMEdo echo $vardone

Предположим, у вас есть каталог с файлами java и вы хотите скомпилировать их. Вы можете написать скрипт, например такой:

...for file in *.javado javac $filedone

Примечание: Вы можете использовать wild-card выражения в ваших скриптах.

Несколько специальных символов и их значения w.r.t shell scripts

$* - Это означает, что все параметры передаются скриптна момент его исполнения.. Что включает в себя $ 1, $ 2и так далее.$0 - Имя выполняемого скрипта.$# - Количество аргументов, указанных в командной строке.$? - Выходной статус последней команды.

Выше приведенные символы известны, как позиционные параметры (positional parameters). Позвольте мне объяснить позиционные параметры с помощью примера. Предположим у меня есть скрипт с названием my_script.sh. Теперь выполним этот скрипт в командной строке следующее:

$ ./my_script.sh linux is a robust OS

... как вы можете видеть выше, я указал 5 параметров скрипта. В соответствии с этим сценарием, значения позиционных параметров состоят в следующем: $ * - "linux ',' является ',' ',' надежных ',' OS". $ 0 - my_script.sh - имя скрипт время казнен. $ # - $ $ - $ 1 - $ 2 - $* - будет содержать значения 'linux','is','a','robust','OS'.$0 - будет содержать значение my_script.sh - имя скрипта во время исполнения.$# - содержит значения 5 - общее количество параметров.br>

$$ - Содержит ID процесса текущей оболочки. Вы можете использовать этот параметр для уникальных имен каких-либо временных файлов, которые вы создаете во время исполнения.

$1 - содержит значения 'linux'$2 - содержит значение 'is'

... и так далее. Операторы set и shift set - позволяет связать значения с позиционными параметрами.Например, попробуйте следующее:

$ set `date`$ echo $1$ echo $*$ echo $#$ echo $2

shift Пример:

$ set `date`$ echo $1 $2 $3$ shift$ echo $1 $2 $3$ shift$ echo $1 $2 $3

Чтобы узнать ID процесса текущего оболочки, попробуйте следующее:

$ echo $$2667

Для проверки, что это одно и то же значение, выполните следующие команды:

$ ps -f |grep bash

Оператор read Сделайте ваш скрипт интерактивным. read позволит пользователю ввести значения, пока скрипт выполняется. Когда программа ждет ввода, она останавливается. Введенный через клавиатуру id считывается, и выполнение программы продолжается.Например:

#!/bin/shecho "Enter your name : "read nameecho "Hello $name , Have a nice day."

Выходной статус последней команды

Каждая команда возвращает значения после выполнения. Эта величина называется статус выхода или возвращаемое значение команды. Команда сообщает true, если выполняется успешно, и false, если нет. Это может быть проверено в скрипте, используя $?.

iamsan.ru

Знакомство с Shell скрипт. Написание простого скрипта для компиляции и запуска программы Java

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

Как я понял, shell script- это последовательность команд (выполняемых интерпретатором командной строки), записанная в текстовый файл. Предположим у нас есть определенная задача, для выполнения которой необходимо ввести несколько команд в терминале. И вот вместо того, чтоб делать это вручную каждый раз, можно записать эти команды в shell script и при необходимости вызывать его.

Пора приступать к практике. Для примера я использую программу «Hello world», традиционную для тех, кто только начинает знакомиться с программированием. Сначала я скомпилирую и запущу ее с помощью терминала. А затем напишу shell скрипт, который будет выполнять аналогичную задачу.

В обычном текстовом редакторе я написал простенькую программку  на языке java, и сохранил ее в директории Work. Программка при вызове должна выводить текст «Hello, Ubuntu!!!».

Запуск с помощью терминала:

Открываю терминал (сочетание клавиш Ctrl+Alt+T). Далее, мне необходимо перейти в директорию, в которой я сохранил файл со своей программкой:cd WorkТак как Java язык компилируемый, то прежде чем запустить программу я должен ее скомпилировать:javac Hello.javaТеперь можно запускать:java HelloСкрин-шот терминала в котором можно увидеть последовательность команд и результат выполнения программы:

Теперь я попробую написать shell skript, который будет проделывать эту работу автоматически. Для этого вновь открываю текстовый редактор, и создаю файл c расширением sh:runner_java.shПервая строка скрипта:#! /bin/bash#! -это шебанг. Именно с него должен начинаться скрипт. Следующая за ним часть строки- имя файла интерпретатора, который будет выполнять скрипт. Узнать текущую используемую shell, можно введя в терминал команду echo $SHELL:

Если у вас используется другая shell, то /bin/bash в первой строке нужно заменить, на имя вашей текущей оболочки. Так как скрипт может не только выполнять команды, но и выводить информацию, то для наглядности я разбавлю его некоторыми информационными сообщениями. Вторая строка:dateВыведет в окне терминала текущую дату. Затем пишу команду, для перемещения в директорию с программой java:cd ~/WorkПредположим, что в директории Work находится не один файл с программами java. Как же указать именно тот, который мне нужен для компиляции и запуска?

echo "Введите имя файла для компиляции" read a javac $a.java

echo "Введите имя файла для компиляции"

read a

javac $a.java

В первой строке, с помощью команды echo, я могу вывести на экран необходимый мне текст. Затем идет команда read, которая предназначена для считывания строки, введенной в терминале. То есть для того, чтобы явно указать нужный мне для запуска java файл, в окне терминала будет выведен текст «Введите имя файла для компиляции». После чего я должен буду ввести название нужного  мне файла, а команда read считает эту строку и сохранит в переменной, например a. Теперь чтобы указать компилятору имя файла, я просто передам ему эту переменную, с введенным мною именем. Делается это с помощью- $имя переменной.

После компиляции, осталось запустить мою программу:java $aЗдесь я вновь конечно же использую переменную с именем a, в которой сохранено имя файла, которое я ввел в терминале, после того как он меня об этом попросил ранее. Теперь этот файл будет уже скомпилирован и готов к запуску.Итоговый вид моего shell скрипта:

Обратите внимание, что я добавил несколько дополнительных информационных сообщений. Команда java -version выведет информацию об установленной на моем ноутбуке версии java. Также я выделили старт и окончание программы.

Теперь мне нужно сделать скрипт исполняемым. Для этого открываю терминал, перехожу в директорию, в которой сохранил скрипт и выполняю следующую команду:chmod 755 runner_java.shЕсли ваш файл с shell скриптом называется иначе, то замените runner_java.sh на имя вашего файла. Настало время запускать скрипт и смотреть, что из этого получилось.

Для этого, находясь в директории с моим shell скриптом я выполняю команду:sh runner_java.sh

Как вы видите, shell script запустился, вывел текущую дату и просит меня ввести имя файла для запуска. Ок, ввожу:

После этого нажимаю Enter и вот итог:

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

Возможно это был не самый лучший пример использования данной возможности Linux. И было бы проще запустить программу традиционным способом. Возможности shell скриптов намного шире. И моей целью было познакомиться и показать как можно автоматизировать рутинные задачи и сделать их более информативными. В дальнейшем я планирую углубить свои знания в этом направлении и поделиться ими с вами.

www.autotest.org.ua

Книги по Shell | ProgBook

Книга посвящена системам UNIX, их истории и развитию. Для различных категорий пользователей описывается работа с утилитами, системными вызовами, командами и библиотечными функциями. Рассматриваются командные языки и командные интерпретаторы Bourne shell, Korn shell, C shell и Bourne Again shell, предоставляющие пользователю удобные средства по взаимодействию с системой. Детально освещёна организация файловой системы, управление вызовами, ввод/вывод и взаимодействие процессов. Обсуждаются вопросы системного администрирования, организации сети, работы с Интернетом. Отдельный раздел посвящён языку С и системному программированию. Для студентов и преподавателей вузов, всех пользователей UNIX, системных администраторов.

Авторы являются разработчиками операционной системы UNIX, великолепно решившие проблему автоматизации деятельности программиста, его творчества за пределами работы. UNIX открыта всем профессионалам. Shell (язык управления заданиями) широко используется, и это подчеркивается многочисленными примерами. Книга предназначена для программистов-пользователей операционной системы UNIX.

Книга «Unix. Программное окружение» является введением в программное окружение UNIX и создана для желающих обучиться программированию с помощью всех инструментов, поставляющихся с операционной системой. Здесь описывается: вход в систему, работа с файлами (cat, mv, cp, rm) и каталогами (cd, mkdir и др.), основы окружения (переменные, маски). Также имеется описание фильтров (grep, sed, awk), программирования оболочки (циклы, сигналы, аргументы, стандартный ввод-вывод). Пользователь сможет ознакомиться с введением в системные вызовы (read, write, open, creat и прочие), с введением в программирование с использованием lex, уасс и make, с работой с документацией с помощью troff, tbl и eqn. Опубликованные в книге примеры становятся частью комплекта программ, которые программисты используют ежедневно. Все программы, имеющиеся в данном издании, написаны на Си, поэтому чтобы понять содержимое книги пользователю необходимо знать этот язык или хотя бы находиться на пути его изучения. После ознакомления с этой книгой читатели смогут работать с системой ещё более эффективно и с удовольствием.

Книга Дэвида Тейнсли «Linux и UNIX: программирование в shell. Руководство разработчика» представлена в виде практического руководства по программированию интерпретатора Bourne shell — стандартного командного интерпретатора в UNIX, совместимого с интерпретатором BASH shell в Linux. В этой книге описано много советов и реальных примеров. Она подойдет как новичкам, так и программистам со стажем. Прочитав ее, пользователь сможет легко создать shell-сценарии для задач, встречающихся во многих системах UNIX и Linux.

progbook.ru

Sha-bang выбор интерпретатора для выполнения команд скрипта

Shell script - скрипт командной оболочки

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

Шелл скрипт для очистки лог-файлов в /var/log
  1. # cleanup
  2. # Для работы сценария требуются права root.
  3. cd /var/log
  4. cat /dev/null > messages
  5. cat /dev/null > wtmp
  6. echo "Лог-файлы очищены."

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

Sha-bang

Sha-bang - это двухбайтовая последовательность #!, после которой указывается, какой интерпретатор необходимо использовать для запуска скрипта, интерпретации и выполнения команд. В качестве интерпретатора может выступать как одна из системных оболочек ( см. файл /etc/shells) например bash или csh так и любой другой интерпретатор команд или просто утилита. Вот несколько примеров маркера sha-bang:

#!/bin/sh #!/bin/bash #!/usr/bin/perl #!/usr/bin/tcl #!/bin/sed -f #!/usr/awk -f

Каждая, из приведенных выше сигнатур, вызывает определенный интерпретатор, будь то /bin/sh -- командный интерпретатор по-умолчанию (bash для Linux-систем), либо иной. При переносе сценариев с сигнатурой #!/bin/sh на другие Unix системы, где в качестве командного интерпретатора установлена другая системная оболочка, вы можете лишиться некоторых функциональных возможностей, присущих bash. Поэтому такие сценарии должны быть POSIX совместимыми.

Portable Operating System Interface, попытка стандартизации UNIX-подобных операционных систем.

Если кроме первой строки, встречаются другие аналогичные строки, они будут восприняты как обычный комментарий.

  1. #!/bin/bash
  2. echo "Первая часть сценария."
  3. a=1
  4. #!/bin/bash
  5. # Это *НЕ* означает запуск нового сценария.
  6. echo "Вторая часть сценария."
  7. echo $a # Значение переменной $a осталось равно 1.

Обратите внимание на то, что сигнатура должна указывать правильный путь к интерпретатору, в противном случае вы получите сообщение об ошибке -- как правило это "Command not found".

Сигнатуру #! можно не указывать, если вы не используете команд специфичных для какого-то конкретного интерпретатора. Например как в расширенной версии скрипте, представленной ниже. Здесь используется специфическая конструкция присвоения значения переменной lines=50.

Еще раз замечу, что сигнатура #!/bin/sh вызывает командный интерпретатор по-умолчанию -- /bin/bash в Linux-системах.

Расширенная версия предыдущего шелл скрипта
  1. #!/bin/bash
  2. # cleanup, version 2
  3. # Для работы сценария требуются права root.
  4.  
  5. LOG_DIR=/var/log
  6. ROOT_UID=0 # Только пользователь с $UID 0 имеет привилегии root.
  7. LINES=50 # Количество сохраняемых строк по-умолчанию.
  8. E_XCD=66 # Невозможно сменить каталог?
  9. E_NOTROOT=67 # Признак отсутствия root-привилегий.
  10.  
  11. if [ "$UID" -ne "$ROOT_UID" ]
  12. then
  13. echo "Для работы сценария требуются права root."
  14. exit $E_NOTROOT
  15. fi
  16.  
  17. if [ -n "$1" ]
  18. # Проверка наличия аргумента командной строки.
  19. then
  20. lines=$1
  21. else
  22. lines=$LINES # Значение по-умолчанию, если число не задано в командной строке
  23. fi
  24.  
  25. # Stephane Chazelas предложил следующее,
  26. #+ для проверки корректности аргумента, переданного из командной строки,
  27. #+ правда это достаточно сложно для данного руководства.
  28. #
  29. # E_WRONGARGS=65 # Не числовой аргумент
  30. #
  31. # case "$1" in
  32. # "" ) lines=50;;
  33. # *[!0-9]*) echo "Usage: `basename $0` file-to-cleanup"; exit $E_WRONGARGS;;
  34. # * ) lines=$1;;
  35. # esac
  36. #
  37. #* Конец проверки корректности аргумента
  38.  
  39. cd $LOG_DIR
  40.  
  41. if [ `pwd` != "$LOG_DIR" ] # или if [ "$PWD" != "$LOG_DIR" ]
  42. # Не в /var/log?
  43. then
  44. echo "Невозможно перейти в каталог $LOG_DIR."
  45. exit $E_XCD
  46. fi # Проверка каталога перед очисткой лог-файлов.
  47.  
  48. # более эффективный вариант:
  49. #
  50. # cd /var/log || {
  51. # echo "Невозможно перейти в требуемый каталог." >&2
  52. # exit $E_XCD;
  53. # }
  54.  
  55. tail -$lines messages > mesg.temp # Сохранить последние строки в лог-файле.
  56. mv mesg.temp messages
  57.  
  58. # cat /dev/null > messages
  59. #* Необходимость этой команды отпала, поскольку очистка выполняется выше.
  60.  
  61. cat /dev/null > wtmp # команды ': > wtmp' и '> wtmp' имеют тот же эффект.
  62. echo "Лог-файлы очищены."
  63.  
  64. exit 0
  65. # Возвращаемое значение 0
  66. #+ указывает на успешное завершение работы сценария.

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

Запуск скриптов

Запустить скрипт системной оболочки можно командой sh scriptname или bash scriptname. Более удобный вариант -- сделать файл скрипта исполняемым, командой chmod.

chmod 555 scriptname # установить права на чтение/исполнение любому пользователю в системе.

или

chmod +rx scriptname # установить права на чтение/исполнение любому пользователю в системе chmod u+rx scriptname # установить права на чтение/исполнение только владельцу скрипта

После того, как вы сделаете файл сценария исполняемым, вы можете запустить его примерно такой командой ./scriptname. При этом, если текст скрипта начинается с корректной сигнатуры sha-bang, для выполнения данного скрипта будет вызван соответствующий интерпретатор.

И наконец, завершив отладку сценария, вы можете поместить его в каталог /usr/local/bin (естественно, что для этого вы должны обладать правами root), чтобы сделать его доступным для себя и других пользователей системы. После этого сценарий можно вызвать, просто напечатав название файла в командной строке и нажав ENTER.

vds-admin.ru