Инструменты пользователя

Инструменты сайта


igor:practicum_po_napisaniju_shell_scripts

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
igor:practicum_po_napisaniju_shell_scripts [2017/01/15 17:18] – [Эксперимент N5: условие с многими вариантами - оператор case.] igorigor:practicum_po_napisaniju_shell_scripts [2019/08/11 20:16] (текущий) – [Для чего нужно овладевать технологией написания сценариев?] igor
Строка 1: Строка 1:
-=====Практикум по написанию сценариев оболочки.===== +Все мои статьи: [[igor:glavnaja|Статьи Игоря Романова]] 
-==== Понятие оболочки и понятие сценария====+=====Практикум по написанию сценариев оболочки===== 
 +==== Понятие оболочки и понятие сценария ====
 Обычный для юниксоидных систем режим работы - терминальный (консольный, диалоговый): пользователь вводит команду, ждет от системы ее выполнения и просматривает результаты, а затем дает следующую.  Обычный для юниксоидных систем режим работы - терминальный (консольный, диалоговый): пользователь вводит команду, ждет от системы ее выполнения и просматривает результаты, а затем дает следующую. 
 Однако в жизни часты ситуации, когда некоторая последовательность команд заранее известна, так что нет смысла вводить команды каждый раз заново - их записывают в файл, и получается сценарий, или скрипт (англ. script). \\ Однако в жизни часты ситуации, когда некоторая последовательность команд заранее известна, так что нет смысла вводить команды каждый раз заново - их записывают в файл, и получается сценарий, или скрипт (англ. script). \\
Строка 7: Строка 8:
 Оболочка (англ. shell) - программа в составе  операционной системы, принимающая команды пользователя и передающая их другим программам для выполнения требуемых действий. Название "оболочка" отражает тот факт, что пользователь имеет дело только с ней, а все другие части ОС скрыты под оболочкой. В современном компьютерном мире известно множество типов программ, которые играют или могут играть роль оболочки. То, что мы только что описали, - диалоговая оболочка. Многие используют графические и псевдографические оболочки (пример псевдографической - Midnight Commander). Однако такие оболочки, как правило, неспособны работать со сценариями. С другой стороны, существуют программы, не являющиеся оболочками, но способные  Оболочка (англ. shell) - программа в составе  операционной системы, принимающая команды пользователя и передающая их другим программам для выполнения требуемых действий. Название "оболочка" отражает тот факт, что пользователь имеет дело только с ней, а все другие части ОС скрыты под оболочкой. В современном компьютерном мире известно множество типов программ, которые играют или могут играть роль оболочки. То, что мы только что описали, - диалоговая оболочка. Многие используют графические и псевдографические оболочки (пример псевдографической - Midnight Commander). Однако такие оболочки, как правило, неспособны работать со сценариями. С другой стороны, существуют программы, не являющиеся оболочками, но способные 
 "переваривать" сценарии. Пример - sed. Это достаточно интересная, хотя теперь почти забытая программа. Надеюсь, когда-нибудь я напишу о ней отдельную статью. Но сегодня предлагаю ограничиться диалоговыми оболочками. \\ \\ "переваривать" сценарии. Пример - sed. Это достаточно интересная, хотя теперь почти забытая программа. Надеюсь, когда-нибудь я напишу о ней отдельную статью. Но сегодня предлагаю ограничиться диалоговыми оболочками. \\ \\
-==== История с предысторией====+==== История с предысторией ====
 В юниксах оболочка была одна-единственная, и называлась просто sh, потому что другого ничего как будто и не было нужно. Впоследствии разные люди написали множество аналогичных программ, отличающихся в основном двумя чертами: во-первых, функциями редактирования ранее поданных команд с целью использовать их вновь (это нужно при работе в диалоговом режиме), и во-вторых, синтаксисом языка скриптов. Что имеем в результате? Если в вашей системе имеется синаптик или другой аналогичный пакетный менеджер, группирующий программы по сферам применения, то вы увидите целый отдельный каталог с диалоговыми оболочками - их там порядка 20! В юниксах оболочка была одна-единственная, и называлась просто sh, потому что другого ничего как будто и не было нужно. Впоследствии разные люди написали множество аналогичных программ, отличающихся в основном двумя чертами: во-первых, функциями редактирования ранее поданных команд с целью использовать их вновь (это нужно при работе в диалоговом режиме), и во-вторых, синтаксисом языка скриптов. Что имеем в результате? Если в вашей системе имеется синаптик или другой аналогичный пакетный менеджер, группирующий программы по сферам применения, то вы увидите целый отдельный каталог с диалоговыми оболочками - их там порядка 20!
 Наиболее известны оболочки Борна - Bourne shell (bsh) и Bourne again shell (bash), Альмквиста (ash), Корна (Korn shell - ksh), zsh и csh. Наиболее известны оболочки Борна - Bourne shell (bsh) и Bourne again shell (bash), Альмквиста (ash), Корна (Korn shell - ksh), zsh и csh.
Строка 18: Строка 19:
 Готовую программу, если нет исходного кода, невозможно изменить - только писать заново с чистого листа. Скрипт же представляет собой текстовый файл (по виду и по сути близкий к исходному тексту программы), который легко может быть прочитан и понят человеком. Ну а если можно прочитать, то отчего бы не попробовать написать? То есть если скрипт, написанный когда-то давно (и возможно не нами), перестает нас удовлетворять, нетрудно будет разобраться, что там к чему, и что-то переписать, и после этого он сразу готов к работе - от хлопот с компиляцией и линкованием мы свободны, и никакого специального ПО не нужно (а оболочка у нас по-любому имеется). \\ Готовую программу, если нет исходного кода, невозможно изменить - только писать заново с чистого листа. Скрипт же представляет собой текстовый файл (по виду и по сути близкий к исходному тексту программы), который легко может быть прочитан и понят человеком. Ну а если можно прочитать, то отчего бы не попробовать написать? То есть если скрипт, написанный когда-то давно (и возможно не нами), перестает нас удовлетворять, нетрудно будет разобраться, что там к чему, и что-то переписать, и после этого он сразу готов к работе - от хлопот с компиляцией и линкованием мы свободны, и никакого специального ПО не нужно (а оболочка у нас по-любому имеется). \\
 Короче, освоить технологию написания скриптов несколько проще, чем настоящее программирование. \\ Короче, освоить технологию написания скриптов несколько проще, чем настоящее программирование. \\
-А недостатки? - А наши недостатки, как известно, - продолжение наших достоинств. В наше время весь компьютерный мир наводнен тысячами полуграмотных сисадминов-эникейщиков, которые научились нажимать мышкой на кнопку "Продолжить" и теперь считают себя крутыми IT-специалистами. Доверь им написать скрипт - они вам такого понапишут - мало не покажется. А чтобы в такие ситуации не попадать, лучше освоить скриптизацию самостоятльно. Для этого и предлагаю вам мой сегодняшний опус. \\+А недостатки? - А наши недостатки, как известно, - продолжение наших достоинств. В наше время весь компьютерный мир наводнен тысячами полуграмотных сисадминов-эникейщиков, которые научились нажимать мышкой на кнопку "Продолжить" и теперь считают себя крутыми IT-специалистами. Доверь им написать скрипт - они вам такого понапишут - мало не покажется. А чтобы в такие ситуации не попадать, лучше освоить скриптизацию самостоятльно. \\
 Если вы ничего не знаете о сценариях оболочки, то для начала рекомендую заглянуть вот сюда: \\ Если вы ничего не знаете о сценариях оболочки, то для начала рекомендую заглянуть вот сюда: \\
 https://losst.ru/napisanie-skriptov-na-bash \\ https://losst.ru/napisanie-skriptov-na-bash \\
-Статья полезная, но минус в том, что не каждый читатель в состоянии понять, для чего по жизни нужны эти "Hello world". Поэтому у меня возникла идея дополнить ее, приблизить читателя "к земле". В результате получился+https://vk.com/@nuancesprog-funkcionalnye-i-gibkie-shell-skripty \\ 
 +Статьи полезные, но их минус в том, что не каждый читатель в состоянии понять, для чего по жизни нужны эти "Hello world". Поэтому у меня возникла идея дополнить ее, приблизить читателя "к земле". В результате получился
 небольшой практикум, который я и предлагаю вашему вниманию сегодня. \\ \\ небольшой практикум, который я и предлагаю вашему вниманию сегодня. \\ \\
  
-==== Эксперимент N1: цикл for, или цикл с параметром====+==== Эксперимент N1: цикл for, или цикл с параметром ====
 Если бы мы планомерно изучали написание сценариев так же, как изучают "настоящее" программирование, то циклы не были бы темой первого урока. Наверно, условные операторы следовало бы изучить раньше. Однако у меня нет простых примеров скриптов с условными операторами, но без циклов. \\ Если бы мы планомерно изучали написание сценариев так же, как изучают "настоящее" программирование, то циклы не были бы темой первого урока. Наверно, условные операторы следовало бы изучить раньше. Однако у меня нет простых примеров скриптов с условными операторами, но без циклов. \\
 === Постановка задачи. === === Постановка задачи. ===
Строка 59: Строка 61:
 echo cp $oldfname $newfname \\ echo cp $oldfname $newfname \\
 done//** \\ \\ done//** \\ \\
-Обратите внимание на то, как задается интервал значений параметра: {01..13}. Это "башизм", т. е. написание, характерное для bash и не поддерживаемое в других оболочках (по крайней мере, во многих других). Это свойство баша делает его привлекательным для меня и до недавнего времени не позволяло мне заменить баш чем-то другим. Но теперь я узнал, что в других оболочках (да и в баше тоже) для этой цели можно использовать утилиту seq. \\ \\+Обратите внимание на то, как задается интервал значений параметра: {01..13}. Это "башизм", т. е. написание, характерное для bash и не поддерживаемое в других оболочках (по крайней мере, во многих других). Это свойство баша делает его привлекательным для меня и до недавнего времени не позволяло мне заменить баш чем-то другим. Но теперь я узнал, что в других оболочках (да и в баше тоже) для этой цели можно использовать утилиту seq. \\ 
 +Еще о циклах for читайте вот здесь: https://losst.ru/tsikly-bash \\ \\
 ==== Эксперимент N2: условный оператор ==== ==== Эксперимент N2: условный оператор ====
 У вас, конечно, есть в домашнем каталоге каталог с фотографиями? \\ У вас, конечно, есть в домашнем каталоге каталог с фотографиями? \\
Строка 67: Строка 70:
 -- Purquois pas? ("Почемы бы и нет?") Наведение порядка в файловом хозяйстве - работа, с которой приходится сталкиваться. И чем больше хозяйство, тем чаще, и объем работы больше. Во времена моей досовской молодости эта работа была весьма хлопотной, и таковой остается сейчас для тех, кто живет в Windows. У нас ситуация другая: линукс - система, в которой автоматизировать и скриптизировать можно буквально все... А значит, давай, мой мальчик, дави на газ! \\ -- Purquois pas? ("Почемы бы и нет?") Наведение порядка в файловом хозяйстве - работа, с которой приходится сталкиваться. И чем больше хозяйство, тем чаще, и объем работы больше. Во времена моей досовской молодости эта работа была весьма хлопотной, и таковой остается сейчас для тех, кто живет в Windows. У нас ситуация другая: линукс - система, в которой автоматизировать и скриптизировать можно буквально все... А значит, давай, мой мальчик, дави на газ! \\
 Скрипт, который мы здесь рассматриваем, - пример из/для школьного учебника. Если в будущем мы захотим довести его до профессионально-индустриального уровня, нам придется изучить утилиту exiftool и еще кое-что, вероятно не обойдется без вышеупомянутого sed... Но это чуть позже, а сейчас сосредоточимся на простом условном операторе. \\ Скрипт, который мы здесь рассматриваем, - пример из/для школьного учебника. Если в будущем мы захотим довести его до профессионально-индустриального уровня, нам придется изучить утилиту exiftool и еще кое-что, вероятно не обойдется без вышеупомянутого sed... Но это чуть позже, а сейчас сосредоточимся на простом условном операторе. \\
-=== Постановка задачи ===+=== Постановка задачи  ===
 С чисто математической точки зрения задача аналогична предыдущей, с одной оговоркой. В предыдущем эксперименте номера дорожек шли строго последовательно. Сегодня номера снимков идут по нарастающей, но не сплошняком, а с пропусками. В принципе, на это можно было бы и закрыть глаза: ничего принципиально страшного не случится. Но правильно ли заставлять компьютер делать то, что он сделать не может? Поэтому напишем цикл аналогично предыдущему, но на каждом шаге введем проверку: существует ли снимок с таким номером? \\ \\ С чисто математической точки зрения задача аналогична предыдущей, с одной оговоркой. В предыдущем эксперименте номера дорожек шли строго последовательно. Сегодня номера снимков идут по нарастающей, но не сплошняком, а с пропусками. В принципе, на это можно было бы и закрыть глаза: ничего принципиально страшного не случится. Но правильно ли заставлять компьютер делать то, что он сделать не может? Поэтому напишем цикл аналогично предыдущему, но на каждом шаге введем проверку: существует ли снимок с таким номером? \\ \\
 **//#!/bin/bash \\ **//#!/bin/bash \\
Строка 82: Строка 85:
 done//** \\ \\ done//** \\ \\
 Условный оператор включает: проверку условия - if, непосредственно за которой идет подлежащее проверке условие, команды для выполнения при истинности условия (начинаются служебным словом then), команды для выполнения при ложности условия (начинаются словом else) и замыкающее служебное слово - fi. \\ Условный оператор включает: проверку условия - if, непосредственно за которой идет подлежащее проверке условие, команды для выполнения при истинности условия (начинаются служебным словом then), команды для выполнения при ложности условия (начинаются словом else) и замыкающее служебное слово - fi. \\
-=== Лирическое отступление===+=== Лирическое отступление ===
 Если честно, то от этого fi разит такой средневековой замшелостью, которая даже у меня - программиста закалки 1980-х годов - поначалу вызывала неприятие. Сразу вспоминаю наших профессоров, которые нам плели сказочки про какой-то псевдокод, а что за псевдокод и для чего - они сами не знали... Потом, много лет спустя, мой компьютерный гуру высказал более-менее внятную (однако же спорную) гипотезу, для чего нужен псевдокод. Поздняк было рыпаться: много лет, даже на ассемблере, я писал текст программы сразу как надо, без всяких схем алгоритмов и уж конечно без всякого псевдокода... \\ Если честно, то от этого fi разит такой средневековой замшелостью, которая даже у меня - программиста закалки 1980-х годов - поначалу вызывала неприятие. Сразу вспоминаю наших профессоров, которые нам плели сказочки про какой-то псевдокод, а что за псевдокод и для чего - они сами не знали... Потом, много лет спустя, мой компьютерный гуру высказал более-менее внятную (однако же спорную) гипотезу, для чего нужен псевдокод. Поздняк было рыпаться: много лет, даже на ассемблере, я писал текст программы сразу как надо, без всяких схем алгоритмов и уж конечно без всякого псевдокода... \\
 Не знаю, может быть я зря впутываю вас в дебри, но все-таки скажу. Это fi знаменует собой безблоковый принцип построения языка, который если где и применялся, то только в псевдокоде, а в настоящих языках программирования - никогда. В классических языках типа паскаля и Си строго соблюдался блоковый принцип, известный с доисторических времен, с эпохи алгола и ПЛ-1. \\ Не знаю, может быть я зря впутываю вас в дебри, но все-таки скажу. Это fi знаменует собой безблоковый принцип построения языка, который если где и применялся, то только в псевдокоде, а в настоящих языках программирования - никогда. В классических языках типа паскаля и Си строго соблюдался блоковый принцип, известный с доисторических времен, с эпохи алгола и ПЛ-1. \\
Строка 89: Строка 92:
 Я вам рассказывал про винтовку и пулемет? Рассказывал применительно к командным оболочкам. Винтовки и пулеметы хороши в локальной контртеррористической операции, но серьезную войну ими не выиграть - для серьезной войны нужна тяжелая артиллерия. Наша артиллерия - компиляционные системы разработки программ. Их языки - это не винтовки и не пулеметы - это шрапнель: все боеприпасы собираются в единое изделие и выстреливаются одномоментно. Чтобы стрельба была эффективна, изделие приходится усложнять, а значит всерьез думать об обеспечении технологичности его производства. Блоковый принцип избавляет от массы гемора при разработке сложных программ. В середине 20-го века, когда появился алгол, люди такими тонкостями отнюдь не пренебрегали. Алгола уже давно нет, но весь наш нынешний юниксоидно-линуксоидный мир (да и виндоусоидный тоже) вырос из него. \\ Я вам рассказывал про винтовку и пулемет? Рассказывал применительно к командным оболочкам. Винтовки и пулеметы хороши в локальной контртеррористической операции, но серьезную войну ими не выиграть - для серьезной войны нужна тяжелая артиллерия. Наша артиллерия - компиляционные системы разработки программ. Их языки - это не винтовки и не пулеметы - это шрапнель: все боеприпасы собираются в единое изделие и выстреливаются одномоментно. Чтобы стрельба была эффективна, изделие приходится усложнять, а значит всерьез думать об обеспечении технологичности его производства. Блоковый принцип избавляет от массы гемора при разработке сложных программ. В середине 20-го века, когда появился алгол, люди такими тонкостями отнюдь не пренебрегали. Алгола уже давно нет, но весь наш нынешний юниксоидно-линуксоидный мир (да и виндоусоидный тоже) вырос из него. \\
 Однако сегодня у нас другие приоритеты. Скрипты пишутся для сравнительно несложных задач. Грубо говоря, с объемом текста в пределах пары страниц и с трудоемкостью в пределах одного человеко-дня. Для решения таких задач нам нужен автомат Калашникова: легкий в освоении, надежный и неприхотливый в эксплуатации. Он как бы и винтовка, как бы и пулемет, и не совсем винтовка, и не совсем пулемет... К нему предъявляются противоречивые требования: он должен с одинаковой эффективностью стрелять как одиночными, так и очередями. И вот тут оказывается, что безблоковый язык подходит для этой цели лучше, чем блоковый. \\ Однако сегодня у нас другие приоритеты. Скрипты пишутся для сравнительно несложных задач. Грубо говоря, с объемом текста в пределах пары страниц и с трудоемкостью в пределах одного человеко-дня. Для решения таких задач нам нужен автомат Калашникова: легкий в освоении, надежный и неприхотливый в эксплуатации. Он как бы и винтовка, как бы и пулемет, и не совсем винтовка, и не совсем пулемет... К нему предъявляются противоречивые требования: он должен с одинаковой эффективностью стрелять как одиночными, так и очередями. И вот тут оказывается, что безблоковый язык подходит для этой цели лучше, чем блоковый. \\
-=== Однако давайте ближе к делу===+=== Однако давайте ближе к делу ===
 После if может идти, вообще говоря, любая команда. Фокус в том, что в юниксоидных системах каждая программа при завершении выдает т. н. exit code:  После if может идти, вообще говоря, любая команда. Фокус в том, что в юниксоидных системах каждая программа при завершении выдает т. н. exit code: 
 при благополучном завершении - 0, при неблагополучном - какое-то другое число. На этом мы и можем сыграть. Однако по жизни в качестве программы - "проверочника" чаще других используется команда test, в данном примере с ключом -e (exist - существует ли файл). Она, если проверяемое условие истинно, выдает exit code = 0. \\ при благополучном завершении - 0, при неблагополучном - какое-то другое число. На этом мы и можем сыграть. Однако по жизни в качестве программы - "проверочника" чаще других используется команда test, в данном примере с ключом -e (exist - существует ли файл). Она, если проверяемое условие истинно, выдает exit code = 0. \\
Строка 105: Строка 108:
 Кстати, комбинируя эти знаки, можно писать условные операторы с объединением нескольких условий по И и по ИЛИ. Здесь мы сталкиваемся с хитрым свойством оболочек, которое отсутствует в "настоящем" программировании: любая команда может сочетать выполнение операций и проверку условий, тогда как в "настоящем" программировании эти функции разделены. \\ \\ Кстати, комбинируя эти знаки, можно писать условные операторы с объединением нескольких условий по И и по ИЛИ. Здесь мы сталкиваемся с хитрым свойством оболочек, которое отсутствует в "настоящем" программировании: любая команда может сочетать выполнение операций и проверку условий, тогда как в "настоящем" программировании эти функции разделены. \\ \\
  
-==== Эксперимент N3: параметры командной строки====+==== Эксперимент N3: параметры командной строки ====
 Что мне не нравится в рассмотренном только что скрипте? \\ Что мне не нравится в рассмотренном только что скрипте? \\
 Этот скрипт обрабатывает группу снимков, сделанных в заданный день, и больше он ни на что не годится. Чтобы обработать снимки, сделанные на следующий день, нам придется открывать скрипт редактором, переписывать значения начала и конца цикла и дату, записывать скрипт на место... и все это ради того, чтобы произвести единственную "пулеметную очередь". А дальше лыко и мочало: начинай сказку с начала. \\ Этот скрипт обрабатывает группу снимков, сделанных в заданный день, и больше он ни на что не годится. Чтобы обработать снимки, сделанные на следующий день, нам придется открывать скрипт редактором, переписывать значения начала и конца цикла и дату, записывать скрипт на место... и все это ради того, чтобы произвести единственную "пулеметную очередь". А дальше лыко и мочало: начинай сказку с начала. \\
Строка 120: Строка 123:
 done//** \\ \\ done//** \\ \\
 Вывше я вам рассказывал про переменные, имена которых начинаются с буквы, а предваряются знаком $. Здесь у нас знак $, за которым, вместо ожидаемого имени переменной, видим просто 1 - на имя переменной никак не похоже. И главное, мы сразу используем это имя в выражении, не присвоив переменной никакого значения - это как вообще??? Выше я говорил о существовании специфических переменных - и вот теперь мы одну из них встречаем вживую. Это, собственно, и есть параметр командной строки, а всего в этом скрипте их три. \\ \\ Вывше я вам рассказывал про переменные, имена которых начинаются с буквы, а предваряются знаком $. Здесь у нас знак $, за которым, вместо ожидаемого имени переменной, видим просто 1 - на имя переменной никак не похоже. И главное, мы сразу используем это имя в выражении, не присвоив переменной никакого значения - это как вообще??? Выше я говорил о существовании специфических переменных - и вот теперь мы одну из них встречаем вживую. Это, собственно, и есть параметр командной строки, а всего в этом скрипте их три. \\ \\
-==== Эксперимент N4: переменные окружения====+==== Эксперимент N4: переменные окружения ====
 На написание этого скрипта меня вдохновил пример MacOS. Там, если к компьютеру подключаешь фотоаппарат (или флэшку с фотографиями), фотографии с него автоматически перекачиваются в компьютер. Я не разобрался, является ли эта фича свойством MacOS или это чья-то самодельная хитрушка, но понял: я, Вань, такую же хочу, но с перламутровыми пуговицами... \\ На написание этого скрипта меня вдохновил пример MacOS. Там, если к компьютеру подключаешь фотоаппарат (или флэшку с фотографиями), фотографии с него автоматически перекачиваются в компьютер. Я не разобрался, является ли эта фича свойством MacOS или это чья-то самодельная хитрушка, но понял: я, Вань, такую же хочу, но с перламутровыми пуговицами... \\
 Я, однако, не стал слепо копировать все, что видел в MacOS. В частности, мне совсем ни к чему перекачивать в компьютер все фотки, найденные на любом носителе: мне надо это делать только, если это флэшка именно с фотоаппарата. Фотоаппарат, как мы знаем, записывает снимки в определенный каталог на карте памяти (обычно подкаталог каталога DCIM). Я хочу те снимки, которые успешно перекачаны в компьютер (в каталог /home/igor/foto-today-camera), сохранить на карте памяти, но переместить в находящийся на ней же каталог-дублер (THISYEAR, который я по окончании года переименую, например, в 2016), чтобы в следующий раз знать, какие снимки новые, а какие уже есть в компьютере. \\ Я, однако, не стал слепо копировать все, что видел в MacOS. В частности, мне совсем ни к чему перекачивать в компьютер все фотки, найденные на любом носителе: мне надо это делать только, если это флэшка именно с фотоаппарата. Фотоаппарат, как мы знаем, записывает снимки в определенный каталог на карте памяти (обычно подкаталог каталога DCIM). Я хочу те снимки, которые успешно перекачаны в компьютер (в каталог /home/igor/foto-today-camera), сохранить на карте памяти, но переместить в находящийся на ней же каталог-дублер (THISYEAR, который я по окончании года переименую, например, в 2016), чтобы в следующий раз знать, какие снимки новые, а какие уже есть в компьютере. \\
Строка 163: Строка 166:
 Окружение, или среда (англ. environment), так же как и командная строка с параметрамии, - нструмент влияния на поведение программ, имеющийся во многих ОС (в т. ч. в DOS и Windows).  Окружение, или среда (англ. environment), так же как и командная строка с параметрамии, - нструмент влияния на поведение программ, имеющийся во многих ОС (в т. ч. в DOS и Windows). 
 Каждый процесс в такой ОС "работает в своем окружении" (в своей среде). Если "родительский" процесс (в нашем случае udev) порождает "дочерний" процесс (в нашем случае shellmount), то он формирует для дочернего процесса определенное окружение. Окружение нашего скрипта содержит порядка 20 переменных, описывающих носитель данных, с которым наш скрипт должен работать. Из этого набора переменных мы используем ID_FS_LABEL ("метку тома", "метку диска"), ID_FS_UUID (уникальный идентификатор файловой системы) и DEVNAME (имя файла-устройства, под которым наш носитель зарегистрирован в каталоге /dev и которое необходимо для осуществления монтирования). \\ Каждый процесс в такой ОС "работает в своем окружении" (в своей среде). Если "родительский" процесс (в нашем случае udev) порождает "дочерний" процесс (в нашем случае shellmount), то он формирует для дочернего процесса определенное окружение. Окружение нашего скрипта содержит порядка 20 переменных, описывающих носитель данных, с которым наш скрипт должен работать. Из этого набора переменных мы используем ID_FS_LABEL ("метку тома", "метку диска"), ID_FS_UUID (уникальный идентификатор файловой системы) и DEVNAME (имя файла-устройства, под которым наш носитель зарегистрирован в каталоге /dev и которое необходимо для осуществления монтирования). \\
-=== Совет от седого компьютерного волка===+=== Совет от седого компьютерного волка ===
 Скрипт, который мы здесь рассмотрели, на самом деле представляет собой совсем несложную программу. Не сравнить с АСУ производством, которую я разрабатывал лет 15 назад. Однако на примере этого скрипта я хочу показать вам один прием программирования, который не только придает нашему творению некую простую "красоту", но и, возможно, избавит нас от определенного гемора потом, если мы захотим что-то в этом скрипте переделать. Я стараюсь все операции по присвоению значения некоторой переменной собрать "в кучку" в одном месте текста, а затем использовать эту переменную как можно скорее. Например, в первом пункте мы занимаемся только тем, что присваиваем значение переменной secretword, и это значение окончательно, а используем его во втором пункте и больше нигде.  Скрипт, который мы здесь рассмотрели, на самом деле представляет собой совсем несложную программу. Не сравнить с АСУ производством, которую я разрабатывал лет 15 назад. Однако на примере этого скрипта я хочу показать вам один прием программирования, который не только придает нашему творению некую простую "красоту", но и, возможно, избавит нас от определенного гемора потом, если мы захотим что-то в этом скрипте переделать. Я стараюсь все операции по присвоению значения некоторой переменной собрать "в кучку" в одном месте текста, а затем использовать эту переменную как можно скорее. Например, в первом пункте мы занимаемся только тем, что присваиваем значение переменной secretword, и это значение окончательно, а используем его во втором пункте и больше нигде. 
 Во втором пункте мы  присваиваем значение переменной dirname на основе secretword, и это значение опять-таки окончательно и используется в следующем пункте... Таким образом данные как бы передаются от одной переменной к другой по эстафете: \\ Во втором пункте мы  присваиваем значение переменной dirname на основе secretword, и это значение опять-таки окончательно и используется в следующем пункте... Таким образом данные как бы передаются от одной переменной к другой по эстафете: \\
Строка 180: Строка 183:
 то есть я изменил в скрипте единственную строчку в полной уверенности, что внесенные изменения не нарушат работу всех остальных частей скрипта. \\ \\ то есть я изменил в скрипте единственную строчку в полной уверенности, что внесенные изменения не нарушат работу всех остальных частей скрипта. \\ \\
  
-==== Эксперимент N5: условие с многими вариантами - оператор case====+==== Эксперимент N5: условие с многими вариантами - оператор case ====
 Собствнно, скрипт будет тот же самый, только мы перепишем пункт 5 с расчетом на то, что у нас не один фотоаппарат, а несколько. \\ Собствнно, скрипт будет тот же самый, только мы перепишем пункт 5 с расчетом на то, что у нас не один фотоаппарат, а несколько. \\
 По самому простому варианту можно использовать уже знакомый нам оператор if, но в баше имеется специальный оператор case, По самому простому варианту можно использовать уже знакомый нам оператор if, но в баше имеется специальный оператор case,
Строка 198: Строка 201:
 esac//** \\ \\ esac//** \\ \\
 Начинающие программисты часто боятся оператора case. С расчетом на них в языках оболочек имеется конструкция if - then - elif - fi, призванная заменить оператор case. Эта конструкция, как и вышеупомянутый fi, не вписывается в философию классических блочных языков. Я этой конструкцией никогда не пользовался и вам не советую. Почему? - По той причине, которой уже слегка касался: программа должна с первых минут писаться так, чтобы потом при локальных "улучшизациях" не только не нарушалась ее работа, но и не терялась ясность и логичность текста. Оператор case позволяет записать проверяемое условие один раз, а затем перечислить все возможные варианты (их ведь может быть не два, а гораздо больше) - стало быть, он соответствует сегодняшним требованиям больше, чем конструкция if - then - elif - fi. А если совсем просто, то оператор case позволяет сделать работу более красиво. \\ Начинающие программисты часто боятся оператора case. С расчетом на них в языках оболочек имеется конструкция if - then - elif - fi, призванная заменить оператор case. Эта конструкция, как и вышеупомянутый fi, не вписывается в философию классических блочных языков. Я этой конструкцией никогда не пользовался и вам не советую. Почему? - По той причине, которой уже слегка касался: программа должна с первых минут писаться так, чтобы потом при локальных "улучшизациях" не только не нарушалась ее работа, но и не терялась ясность и логичность текста. Оператор case позволяет записать проверяемое условие один раз, а затем перечислить все возможные варианты (их ведь может быть не два, а гораздо больше) - стало быть, он соответствует сегодняшним требованиям больше, чем конструкция if - then - elif - fi. А если совсем просто, то оператор case позволяет сделать работу более красиво. \\
--------------\\+----------------------\\
 Игорь Романов Игорь Романов
  
igor/practicum_po_napisaniju_shell_scripts.1484489926.txt.bz2 · Последнее изменение: 2017/01/15 17:18 (внешнее изменение)