Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Пошук по одному символу (метасимвол ?) ⇐ ПредыдущаяСтр 6 из 6
Метасимвол? здійснює пошук будь-якого одного символу в імені файлу за винятком лідируючої крапки. Припустимо, ви маєте книгу, в якій 12 глав і хочете отримати список глав до 9-го розділу. Якщо ваш довідник містить наступні файли: Chapter 1 Chapter2 Chapter5 Chapter9 Chapter 11 то введіть команду ls з метасимволом? для отримання всіх глав, які починаються з рядка "Chapter" і закінчуються одним символом: $ Is Chapter?<CR> Chapter 1 Chapter2 Chapters Chapter9 $ Хоча метасимвол здійснює пошук одного символу, ви можете використовувати його для пошуку більше одного символу в імені файлу. Наприклад, ви отримаєте перелік всієї решти розділів в поточному довіднику, якщо введете наступну команду: ls Chapter??<CR> І, звичайно, щоб отримати список всіх глав в поточному довіднику, використовуйте метасимвол *: ls Chapter*<CR> Пошук одного набору (метасимвол [ ]) Якщо ви хочете, щоб shell знайшов будь-який символ з перерахованих вами символів, то укладете ці символи в квадратні дужки. Припустимо, ваш довідник містить наступні файли: cat, fat, mat, rat. Якщо ви скористаєтеся як частина імені файлу шаблоном [erf], то shell шукатиме імена файлів, в які входять або буква "с", або буква "r", або буква "f" у вказаній позиції. Приклад: $ Is [crf]at<CR> cat fat rat $ Символи, які можуть бути згрупований в дужки, називаються класом символів. Дужки можуть також використовуватися для позначення діапазону символів, цифр або букв. Припустимо у вашому довіднику містяться наступні файли: chapteri, chapter2, chapters, chapter4, chapter5, chapter6. Якщо ви вкажете: chapter[1-5] то shell знайде файли з chapteri по chapter5. Клас символів можна також вказати за допомогою діапазону букв. Якщо ви вкажете [A-Z], то shell шукатиме тільки великі букви, якщо [а-z] - то малі букви. Створення простих програм shell Почнемо опис створення простих програм shell, які виконують задачі: § друк поточного довідника; § список вмісту цього довідника; § відображення наступних повідомлень на вашому терміналі: "This is end shell program." За допомогою редактора створіть файл dl і введіть в нього рядки: pwd<CR> ls<CR> echo This is end shell program.<CR> Тепер ви маєте програму shell. Ви можете за допомогою cat відобразити вміст файлу: $ cat dl<CR> pwd ls echo This is end shell program. $ Виконання програм shell Виконати shell програму ви можете за допомогою команди sh. Введіть:
sh dl<CR> Коли команда dl виконується за допомогою sh, то спочатку друкується ім'я шляху поточного довідника, потім список файлів в поточному довіднику і в кінці коментар: "This is end shell program." За допомогою команди chmod ви можете зробити файл виконуваним: $ chmod u+x dl<CR> $ls-KCR> total 2 -xw—— 1 login login 3661 Nov 2 10:28 mbox -xwx-— 1 login login 48 Nov 15 10:50 dl $ Зверніть увагу, що chmod включає дозвіл на виконання (+х) для користувача (и). Тепер dl є виконуваною програмою. Спробуйте виконати її. Введіть: dl<CR> Створення довідника bin для виконуваних файлів Щоб зробити shell програми доступними зі всіх ваших довідників, ви можете створити довідник bin в своєму реєстраційному довіднику і переписати shell програми в цей довідник. За допомогою змінної PATH ви можете включити ваш довідник" bin: PATH = $PATH:$HOME/bin Як у всякій мові програмування в тексті на мові shell можуть бути коментарі. Для цього використовується символ "#". Все, що знаходиться в рядку (в командному файлі) ліворуч цього символу, сприймається інтерпретатором як коментар. Наприклад # Це коментар. ## І це. ### І це теж. Як у всякій процедурній мові програмування, в мові shell є оператори. Ряд операторів дозволяє управляти послідовністю виконання команд. В таких операторах часто необхідна перевірка умови, яка і визначає напрям продовження обчислень. Умовний оператор if В загальному випадку оператор "if має структуру if умова then список [elif умова then список] [else список] fi Тут "elif скорочений варіант від "else if може бути використаний разом з повним, тобто допускається вкладення довільного числа операторів "if (як і інших операторів). Зрозуміло "список" в кожному випадку повинен бути осмислений і допустимий в даному контексті. Конструкції [elif умова then список] і [else список] не є обов'язковими Сама усічена структура цього оператора if умова then список fi якщо виконана умова (як правило це грудка отриманий код завершення "О", то виконується "список", інакше він пропускається. Зверніть увагу, що структура обов'язково завершується службовим словом "fi". Число "fi", природно, завжди повинне відповідати числу "if.
Приклади. Хай написаний розрахунок "if-1" if[$l-gt$2] then pwd else echo $0: Hello! Fi Тоді виклик розрахунку if-1 12 11 Дасть /home/sae/STUDY/SHELL а if-1 12 13 Дасть if-1: Hello!
Ще приклад на вкладеність ### # if-3: Оцінка досягнень echo -n " А яку оцінку отримав на іспиті?: " readz if[$z=5] then echo Молодець! elif[$z=4] then echo Все одно молодець! elif[$z=3] then echo Все одно! elif[$z=2] then echo Все! else echo! fi Можна звернути увагу на те, що бажано використовувати зсуви при записі програм, щоб краще виділити вкладеність структур. Оператор вибору "case"має структуру: Конструкція case... esac дозволяє вибрати вам один з декілька шаблонів і потім виконати список команд для цього шаблона. Вираз-шаблон повинен починатися з ключового слова in, а права кругла дужка повинна бути поміщений після останнього символу кожного шаблона. Послідовність команд для кожного шаблона закінчується двома знаками;;. Конструкція case повинна бути закінчений ключовим словом esac. case рядок in шаблон) список команд;; шаблон) список команд;; . Esac Приклад. ### # case-1: Структура "case". # Вже що розглядався в зв'язку з # структурою "if приклад простіше і # наглядніше можна реалізувати з # допомогою структури "case". echo -n " А яку оцінку отримав на іспиті?: " read z case $z in 5) echo Молодець!;; 4) echo Все одно молодець!;; 3) echo Все одно!;; 2) echo Все!;; #) echo!;; ^ esac Незвикло виглядають в кінці рядків вибору ";;", але написати тут ";" було б помилкою. Для кожної альтернативи може бути виконано декілька команд. Якщо ці команди будуть записані в один рядок, то символ ";" використовуватиметься як роздільник команд. Звичайно останній рядок вибору має шаблон "*", що в структурі "case" означає "будь-яке значення". Цей рядок вибирається, якщо не відбувся збіг значення змінної (тут $z) ні з одним з раніше записаних шаблонів, обмежених дужкою ")". Значення є видимими в порядку запису. ### # case-2: Довідник. # Для різних фірм на ім'я видається # назва холдингу, в який вона входить case $1 in ONE|TWO|THREE) echo Холдинг: ZERO;; MMM|WWW) echo Холдинг: Not-Net ;; Hi|Hello[Howdoing) echo Холдинг: Привіт!;; *) echo Немає такої фірми;; Esac При виклику "case-2 Hello" на екран буде виведений: Холдинг: Привіт! А при виклику "case-2 HELLO" на екран буде виведений: Немає такої фірми Коли скоро слово "case" переводиться як "вибір", то це як би натяк на те, що можна цю структуру використовувати для реалізації найпростіших меню. ### # case-3: Реалізація меню за допомогою команди "case echo" "Назвіть файл, а потім (через пропуск) наберіть цифру, відповідну необхідній обробці: 1 - відсортувати 2 - видати на екран 3 - визначити число рядків " read х у # х - ім'я файлу, у - що зробити case $y in 1)sort<$x„ 2)cat<$x;; 3) we -1 < $x;; *) echo " Ми не знаємо такої команди! ";; Esac Зрозуміло, бажання можуть бути складніші і на місці окремих команд можуть бути послідовності команд або виклики складніших розрахунків. Напишемо команду "case-4", яка додає інформацію до файлу, вказаного першим параметром (якщо параметр один), із стандартного входу, або (якщо 2 параметри) з файлу, вказаного як перший параметр: ### # case-4: Додавання у файл. # Використовування стандартної змінної. # "$#" - число параметрів при введенні розрахунку
# "»" - перенаправлення з додаванням у файл case $# in 1)cat»$l ;; 2)cat»$2<$l;; *) echo "Формат: case-4 [звідки] куди";; Esac "$1" (при "$#=1") - це ім'я файлу, в який відбувається додавання із стандартного входу. "$1" і "$2" (при $#-2) - це імена файлів, з якого ("$!") і в який ("$2") додавати. У всіх інших випадках (*) видається повідомлення про те, яким повинен бути правильний формат команди. Оператор циклу з переліком ("for") Оператор for виконує послідовність команд для кожного елемента списку. Для кожної ітерації циклу наступний елемент списку привласнюється змінній, даній в операторі for. Посилання на цю змінну може бути зроблено в будь-якому місці в командах усередині оператора do. При конструюванні кожної секції команд вам необхідно переконатися, що кожному do відповідає done в кінці циклу. Оператор циклу "for" має структуру: for ім'я [in список значень] do список команд done де "for" - службове слово визначаюче тип циклу, "do і "done" -службові слова", виділяючі тіло циклу. Не забувайте про "done"! Фрагмент "in список значень" може бути відсутній. Часто використовується форма "for i in *", що означає "для всіх файлів поточного каталога". Хай "proc-sort" у свою чергу представляється командним файлом cat $ 1 | sort | tee /dev/lp > ${ 1 }_sorted тобто послідовно сортуються вказані файли, результати сортування виводяться на друк ("/dev/lp") і прямують у файли fl_sorted f2_sorted і f3_sorted Можна зробити більш універсальною команду "Isort", якщо не фіксувати перелік файлів в команді, а передавати довільне їх число параметрами. Тоді головна програма буде наступною: for i do proc-sort $i ' done Тут відсутність після "i" службового слова "in" з переліком імен говорить про те, що список поступає через параметри команди. Результат попереднього прикладу можна отримати, набравши Isort fl Ј2 f3 Ускладнимо задачу визначення холдингу фірми, що раніше розглядалася. Тепер можна при виклику указувати довільну кількість фірм. За відсутності в структурі оператора "for фрагмента" "in список значень", значення беруться з параметрів зухвалої команди. ### # holding: Довідник. # Для різних фірм на ім'я видається # назва холдингу, в який вона входить fori do case $i in ONE|TWO|THREE) echo Холдинг: ZERO;; MMM|WWW) echo Холдинг: Not-Net;; Hi|Hello|Howdoing) echo Холдинг: Привіт!;; *) echo Немає такої фірми;; Esac done При виклику "holding Hello HELLO ONE" на екрані буде:
Холдинг: Привіт! Немає такої фірми Холдинг: Not-Net Наступний розрахунок ілюструє корисний, хоча і з часткою трюкача, спосіб повторення одних і тих же дій кілька разів. Змінна "i" приймає тут п'ять значень: 1, 2, 3, 4, 5, але усередині циклу ця змінна відсутня і тому її значення ніякої ролі не грає і ні чого не міняє. З таким же успіхом змінна "i" могла приймати значення, скажемо ф про до у з, а в результаті точно також би було п'ять разів повторено одне і те ж обчислення вмісту циклу без змін. ### # print-5: Організації п'ятикратного виконання команди for i in 1 2 3 4 5 do cat file-22 > /dev/lp done Розрахунок "print-n" ілюструє ще одну корисну можливість у використовуванні циклу "for". Тут, після "for i...", відсутні "in..." і перелік імен, тобто переліком імен для "i" стає перелік параметрів," а отже кількість друкованих екземплярів можна міняти. ### # print-n: Завдання числа копій # через параметри For i do cat file-22 > /dev/lp done Значення не зміниться, якщо перший рядок розрахунку записати як for i in $* оскільки значення "$*" - є список значень параметрів. Відзначимо відмінність в спеціальних змінних "$*" і "$@", що представляють перелік параметрів. Перший представляє параметри, як рядок, а другий, як сукупність слів. Хай командний файл "сmр" має вигляд: for i in "$*" do echo $i done echo for i in "$@" do echo $i done
При виклику cmp aa bb cc на екран буде виведений аа bb cc аа bb cc Оператор циклу з істинною умовою ("while") Структура "while", також забезпечуюча виконання розрахунків, переважно тоді, коли невідомий наперед точний список значень параметрів або цей список повинен бути отриманий в результаті обчислень в циклі. Оператор циклу "while" має структуру: while умова do список команд done де "while" - службове слово визначаюче тип циклу з істинною умовою. Список команд в тілі циклу (між "do" і "done") повторюється до тих пір, поки зберігається істинність умови (тобто код завершення останньої команди в тілі циклу рівний "О") або цикл не буде перерваний зсередини спеціальними командами ("break", "continue" або "exit"). При першому вході в цикл умова повинна виконуватися. ### # print-50: Структура "while" # Розрахунок дозволяє надрукувати 50 # екземплярів файлу "file-22" n=0 while [ $n -It 50 ] # поки п < 50 do n='expr $n+ Г cat file-22 > /dev/lp done Звернемо увагу на те, що змінній "п" спочатку привласнюється значення 0, а не порожній рядок, оскільки команда "ехрr" працює з shell-змінними як з цілими числами, а не як з рядками. n='ехрr $n+ 1’ тобто при кожному виконанні значення "n" збільшується на 1. Як і взагалі в житті, можна реалізувати те ж саме і складніше. Розрахунок "pr-br" приведений для ілюстрації нескінченного циклу і використовування команди "break", яка забезпечує припинення циклу. ###, # pr-br: Структура "while" з "break" # Розрахунок дозволяє надрукувати 50 # екземплярів файлу "file-22 n=0" while true do if[$n-lt50] #якщо n<50 then n=’expr $n+1'
else break fi cat file-22 > /dev/lp done Команда "break [n]" дозволяє виходити з циклу. Якщо "п" відсутній, то це еквівалентно "break I", "n" указує число вкладених циклів, з яких треба вийти, наприклад, "break 3" - вихід з трьох вкладених циклів. На відміну від команди "break команда" "continue [n]" лише припиняє виконання поточного циклу і повертає на ПОЧАТОК циклу. Вона також може бути з параметром. Наприклад, "continue 2" означає вихід на початок другого (якщо вважати з глибини) вкладеного циклу. Команда "exit [n]" дозволяє вийти взагалі з процедури з кодом повернення "О" або "n" (якщо параметр "n" вказаний). Ця команда може використовуватися не тільки в циклах. Навіть в лінійній послідовності команд вона може бути корисний при відладці, щоб припинить виконання (поточного) розрахунку в заданій крапці. Оператор циклу з помилковою умовою ("until") Оператор циклу "until" має структуру: until умова do список команд Done де "until" - службове слово визначаюче тип циклу з помилковою умовою. Список команд в тілі циклу (між "do" і "done") повторюється до тих пір, поки зберігається помилковість умови або цикл не буде перерваний зсередини спеціальними командами ("break", "continue" або "exit"). При першому вході в цикл умова не повинна виконуватися. Відмінність від оператора "while" полягає в тому, що умова циклу перевіряється на помилковість (на ненульовий код завершення останньої команди тіла циклу) перевіряється ПІСЛЯ кожного (у тому числі і першого!) виконання команд тіла циклу. Програмістів, знайомих з операторами "until" в інших мовах може спочатку збивати така семантика цього оператора. Приклади. until false do readx if[$x=5] then echo enough; break else echo some more fi done Тут програма з нескінченним циклом чекає введення слів (повторюючи на екрані фразу "some more"), поки не буде введений "5". Після цього видається "enough" і команда "break" припиняє виконання циклу. Інший приклад ("Очікування півдня") ілюструє можливість використовувати в умові обчислення. until date | grep 12:00: do sleep 30 done Тут кожні 30 секунд виконується командний рядок умови. Команда "date" видає поточну дату і час. Команда "grep" одержує цю інформацію через конвейєр і намагається сумістити заданий шаблон "12:00:" з часом, видаваним командою "date". При неспівпаданні "grep" видає код повернення "I", що відповідає значенню "брехня", і цикл "виконує очікування" протягом 30 секунд, після чого повторюється виконання умови. Опівдні (можливо з декількома секундами) відбудеться порівняння, умова стане істинною, "grep" видасть на екран відповідний рядок і робота циклу закінчиться. Контрольні питання: 1. Що таке Shell? 2. Основні мета символи Shell? 3. Як працюють мета символи *,?, []? 4. Як відбувається створення та виконання програми Shell? 5. Умовний оператор? 6. Оператор вибору? 7. Оператор циклу з переліком? 8. Оператор циклу з істинною умовою? 9. Оператор циклу з помилковю умовою? 10. Як створити довідник для виконуваних файлів?
Література: 1. Паркер Тим. Linux 5.2. Энциклопедия пользователя: Пер. с англ./Тим Паркер – К.: Издательство «ДиаСофт», 1999. – 688 с., стор. 176-191.
|
|||||||||
Последнее изменение этой страницы: 2017-02-06; просмотров: 212; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 13.58.252.8 (0.121 с.) |