|
|
(Одна проміжна версія одного користувача не показана) |
Рядок 1: |
Рядок 1: |
− | Змінні
| + | Ім'я змінної в bash має обов'язково починатися з літери. Далі в імені змінної можна використовувати і цифри. В bash змінні не мають типу, тому оголошувати змінну попередньо не потрібно, а відразу можна присвоювати значення. Значення присвоюються наступним чином: |
| | | |
− | Ім'я змінної в bash має обов'язково починатися з літери. Далі можна використовувати і цифри. В bash змінні не мають типу, тому оголошувати змінну попередньо не потрібно, а відразу можна присвоювати значення:
| + | Z1=Hello! |
| + | Z2="Hello World!" |
| | | |
| + | Якщо змінній присвоюється рядок що містить пробіли або інші спецсимволи, її обов'язково потрібно взяти у подвійні лапки. Біля знаку "=" не повинно бути пробілів. |
| | | |
− | #! / Bin / bash
| + | Щоб отримати доступ до вмісту змінної, перед ім'ям змінної ставлять символ "$": |
− | # Мінлива
| + | |
− | S1 = Hello!
| + | |
− | S2 = "Hello World!"
| + | |
− | | + | |
− | Якщо змінній присвоюється рядок містить пробіли (або інші спецсимволи), то її потрібно обов'язково взяти в подвійні лапки, інакше нічого не вийде. Також зверніть увагу, що навколо знака = не повинно бути пробілів.
| + | |
− | | + | |
− | Щоб отримати доступ до вмісту змінної, перед ім'ям змінної ставлять символ $: | + | |
| | | |
| echo $ S1 | | echo $ S1 |
| echo $ S2 | | echo $ S2 |
| | | |
− | У цьому випадку буде виконана операція підстановки. Спочатку конструкція $ S2 буде замінена на Hello World, а потім буде виконана команда echo Hello World. Операція підстановки може бути виконана не тільки у випадку команди echo, а й в інших командах, наприклад командах порівняння. У цьому випадку рекомендується брати конструкцію $ S1 в подвійні лапки - "$ S1". Пізніше ми докладніше розглянемо чому. Як підстановки може бути використаний і результат виконання команди. Синтаксис схожий - пишемо символ $, а потім команду в круглих дужках без пробілів. Наприклад: OF = / var/backup- $ (date +% Y% m% d). Tgz. У цьому прикладі спочатку буде виконана команда в дужках - date +% Y% m% d, результат виконання якої буде поточна дата в форматі YYYYMMDD (наприклад 20091217). Потім буде виконана підставка, щоб утворилася рядок / var/backup-20091217.tgz і потім цей рядок буде присвоєна змінної OF.
| + | Змінні можуть бути локальними і глобальними. Глобальні ми розглянули вище, а локальні описуються за допомогою слова local. |
− | | + | |
− | Не забувайте, що якби в рядку були б прогалини, то всю конструкцію слід було б взяти в подвійні лапки: "OF = / var / backup $ (date +% Y% m% d). Tgz".
| + | |
− | | + | |
− | Змінні можуть бути локальними і глобальними. Глобальні ми розглянули вище, а локальні описуються за допомогою слова local. Розглянемо наступний приклад: 1 | + | |
− | 2
| + | |
− | 3
| + | |
− | 4
| + | |
− | 5
| + | |
− | 6
| + | |
− | 7
| + | |
− | 8
| + | |
− | 9 #! / Bin / bash
| + | |
− | STR = Hello
| + | |
− | function echoworld {
| + | |
− | local STR = World
| + | |
− | echo $ STR
| + | |
− | }
| + | |
− | echo $ STR
| + | |
− | echoworld
| + | |
− | echo $ STR
| + | |
− | | + | |
− | | + | |
− | Результат виконання команди буде наступний:
| + | |
− | | + | |
− | Hello
| + | |
− | World
| + | |
− | Hello
| + | |
− | | + | |
− | Про функції ми поговоримо пізніше. Зараз основну увагу на те, що хоча висновок на екран здійснюється однією і тією ж командою echo і однієї і тієї ж змінної STR, результат виведення різний. Так як в тілі функції була оголошена локальна змінна і при зверненні до неї з функції буде виводиться локальне значення. Якщо висновок йде з тіла скрипта, то виводиться спочатку задане глобальне значення змінної.
| + | |
− | Конструкція if
| + | |
− | | + | |
− | Для перевірки умов в скрипті призначена конструкція if. Загальний синтаксис конструкції if в спрощеному вигляді, наступний:
| + | |
− | if [умова]; then
| + | |
− | блок команд
| + | |
− | else
| + | |
− | блок команд
| + | |
− | fi
| + | |
− | | + | |
− | Ключові елементи конструкції це if, then, else, fi. Крапка з комою потрібна тільки в тому випадку якщо на одному рядку розташовано більше одного ключового елементу конструкції if. Якщо кожен ключовий елемент буде розташований на новому рядку, то крапка з комою не потрібна. Розглянемо наступний практичний приклад:
| + | |
− | | + | |
− | #! / Bin / bash
| + | |
− | STR = "Hello world"
| + | |
− | if [$ STR = "Hello world"]
| + | |
− | then
| + | |
− | echo YES
| + | |
− | else
| + | |
− | echo NO
| + | |
− | fi
| + | |
− | | + | |
− | У прикладі вище є помилка. На початку лекції я згадував, що в операціях порівняння бажано брати в лапки конструкції $ STR. Нашому випадку в результаті першої підстановки одержимо наступне:
| + | |
− | | + | |
− | [Hello world = "Hello world"]
| + | |
− | | + | |
− | Логіка роботи [] наступна: Після відкриває дужки [обов'язково пробіл (перший), далі до наступного пробілу (другого) перше порівнюване значення, далі оператор порівняння (наприклад =), далі пробіл (третій) і від нього до наступного пробілу (четвертий) друге порівнюване значення. Відразу після четвертого пропусків закриває дужка]. У нас же вийшло, порушення даного правила в результаті того, що в змінній STR є прогалини. Якщо укласти $ STR в подвійні лапки "$ STR" то помилки не буде. Виправте скрипт і перевірте.
| + | |
− | | + | |
− | Конструкція порівняння [] видає в результаті число: 0 - якщо умова вірна, і відмінне від нуля, якщо невірне. Якщо результатом буде нуль, то виконуватися команди від then до наступної ключової конструкції, якщо результат відмінний від нуля, то виконається блок команд від else до наступної ключової конструкції. До речі використовувати конструкцію [] можна не тільки в if, але і окремо, далі розглянемо подібні приклади. Також хочу відзначити, що [] більш нова конструкція і має більш старий аналог, який також часто зустрічається в скриптах. Це команда test. Рядок if [$ STR = "Hello world"] можна записати так: if test $ STR = "Hello world".
| + | |
− | | + | |
− | Щоб подивитися вбудовану довідку про конструкцію if, необхідно в інтерпретаторі набрати help if. Тоді буде відображена коротка довідка про синтаксис. Повністю синтаксис виглядає наступним чином:
| + | |
− | | + | |
− | if COMMANDS; then COMMANDS; [elif COMMANDS; then COMMANDS;] ... [else COMMANDS;] fi
| + | |
− | | + | |
− | Таким чином присутній ще один ключовий елемент - elif. Пропоную самостійно розібрати цей варіант і скласти свій тестовий bash-скрипт із застосуванням elif.
| + | |
− | | + | |
− | Конструкцію if з прикладу можна написати в командному рядку та виконати в інтерактивному режимі. Виглядати рядок буде ось так:
| + | |
− | | + | |
− | STR = "Hello world"; if ["$ STR" = "Hello world"]; then echo YES; else echo NO; fi
| + | |
− | | + | |
− | Так само як і в скрипті, але присутні крапки з комою, які відокремлюють команди і ключові елементи. Ще раз звертаю увагу на прогалини в []. Щоб не забувати про це запам'ятайте, що [це просто команда (на зразок будь-якої іншої команди linux), а після команди завжди йде пробіл і далі ключі або параметри.
| + | |
− | Оператори порівняння
| + | |
− | | + | |
− | Раз вже ми заговорили про конструкцію порівняння ([] або test), то саме час познайомиться з операторами порівняння мови bash. З одним із них вже познайомилися - це =. Розглянемо інші.
| + | |
− | | + | |
− | Оператори порівняння в bash бувають арифметичними (для порівняння чисел) і операторами порівняння рядків.
| + | |
− | Арифметичні оператори складаються з двох символів перед якими стоїть дефіс. Нижче представлені арифметичні оператори і в дужках їх аналогія з мови С.
| + | |
− | | + | |
− | -Lt - less then - менше (<)
| + | |
− | -Gt - greater then - більше (>)
| + | |
− | -Le - less or equal - менше або дорівнює (<=)
| + | |
− | -Ge - greater or equal - більше або дорівнює (> =)
| + | |
− | -Eq - equal - одно (==)
| + | |
− | -Ne - not equal - не одно (! =)
| + | |
− | | + | |
− | Якщо знайомі з англійською мовою, то запам'ятати буде нескладно.
| + | |
− | | + | |
− | Оператори порівняння рядків запам'ятати легше.
| + | |
− | | + | |
− | STR1 = STR2 - одно
| + | |
− | STR1! = STR2 - не дорівнює
| + | |
− | STR1 <STR2 - менше
| + | |
− | STR1> STR2 - більше
| + | |
− | -N STR1 - повертає 0 якщо рядок ненульова (має хоча б один символ)
| + | |
− | -Z STR1 - повертає 0 якщо рядок нульової довжини.
| + | |
− | | + | |
− | Практичний приклад. Наберіть і виконайте в консолі наступний рядок (не забувайте про прогалини!):
| + | |
− | | + | |
− | STR1 = aaa; STR2 = abc; ["$ STR1" = "$ STR2"]; echo $?
| + | |
− | | + | |
− | В результаті ви отримаєте число 1, яке виведе команда echo $?. Конструкція $? містить числовий результат виконання попередньої команди. Попередня команда була ["$ STR1" = "$ STR2"] в разі виконання умови команда повернула б 0, але так як умова не виконується, то результат виконання команди відмінний від нуля.
| + | |
− | | + | |
− | На завершення кілька слів про операції перевірки файлу. Практично в кожному системному скрипті ви зустрінете конструкцію на зразок [-a / etc / filename] або [-f "$ file"], де file - це змінна містить ім'я файлу. Це операція перевірки файлу або властивостей файлу. Як параметр в команді використовується ім'я файлу.
| + | |
− | | + | |
− | [-F "file name"] - повертає 0, якщо файл існує і це регулярний файл
| + | |
− | [-E "file name"] - повертає 0, якщо файл існує
| + | |
− | [-W "file name"] - повертає 0, якщо файл існує і в нього є право запису
| + | |
Ім'я змінної в bash має обов'язково починатися з літери. Далі в імені змінної можна використовувати і цифри. В bash змінні не мають типу, тому оголошувати змінну попередньо не потрібно, а відразу можна присвоювати значення. Значення присвоюються наступним чином:
Якщо змінній присвоюється рядок що містить пробіли або інші спецсимволи, її обов'язково потрібно взяти у подвійні лапки. Біля знаку "=" не повинно бути пробілів.
Змінні можуть бути локальними і глобальними. Глобальні ми розглянули вище, а локальні описуються за допомогою слова local.