Гайд для початківців: як писати Shell скрипти

Написати скрипти в Linux простіше, ніж ви думали. Іноді сценарії оболонки (часто звані Shell  або Bash скрипти) — це справжні програми зі складним кодом усередині. В інших випадках — це просто довгий список завдань, які користувачі Linux складають разом, щоб зробити роботу швидшою та простішою.

За допомогою скриптів ви можете автоматизувати деякі повторювані завдання. Наприклад, ви зібрали Arch Linux з нуля. За допомогою скриптів Bash ви можете автоматизувати майже весь процес після інсталяції: середовище робочого столу, драйвери, налаштування користувача тощо.

Нумо розбиратися, що таке Shell скрипти та як їх писати.

Словник

* Bash — інтерпретатор командної мови. Він доступний у різних ОС і є інтерпретатором команд за замовчуванням у більшості систем GNU/Linux. Назва є абревіатурою від «Bourne-Again SHell».

* Shell — це макропроцесор, який дозволяє виконувати інтерактивні чи неінтерактивні команди.

* Скрипти — це сценарії, що дозволяють автоматично виконувати команди.

Що таке Shell?

Інтерпретатор командного рядка, або Shell (оболонка) — це та програма, яка приймає команди від користувача та виконує їх.

До функцій оболонки належать:

  • взаємодія з користувачем (редагування командного рядка, історія команд тощо);
  • обробка (розширення) шаблонів імен (*, ? тощо);
  • перенаправлення введення/виведення команд;
  • управління завданнями.

Наприклад, за допомогою команд та оболонки ви можете взаємодіяти зі своїм комп’ютером, щоб дізнатися: 

  • поточну дату та час (date), 
  • шукати календар (cal), 
  • перевіряти місце розташування вашого поточного робочого каталогу (pwd), 
  • витягувати список усіх файлів та каталогів, розташованих усередині (ls).

І це лише вершина айсберга.

Крім того, Shell — це спеціалізована мова програмування, в якій є змінні, функції, конструкції while, if, for та багато іншого. Вона дозволяє писати як нескладні сценарії для автоматизації повсякденних завдань, так і досить складні програми (наприклад, запуск та зупинка більшості систем Unix виконуються сценаріями мовою Shell).

На перший погляд, робота безпосередньо в командному рядку (а не в оболонці типу NortonCommander), не досить зручна. Проте, вона забезпечує більш комфортний доступ до таких функцій, як перенаправлення вводу/виводу та управління завданнями. Оболонки типу Midnight Commander в цьому випадку тільки заважають.

Існує кілька підвидів Shell:

Навіщо потрібні скрипти?

А тепер уявіть, що виконання всіх перерахованих вище команд — ваша щоденна рутина. День за днем ви повинні в обов’язковому порядку виконувати всі вищезгадані команди, а також зберігати інформацію, яку отримали. З часом усе це стане завданням, що втомлює і забирає час. Щоб спростити життя, слід вигадати спосіб виконати всі команди разом. Тут скрипти стають вашим порятунком.

Приклад. Використовуйте оболонку в поєднанні з вашим текстовим редактором, приміром, vim, gedit або іншим, щоб створити новий файл з ім’ям task.sh. Він має містити усі перелічені команди, кожна в окремому рядку.

Далі зробіть новий файл, що виконується за допомогою команди chmod з параметром +x. Тепер, запустіть новий скрипт, додавши до його імені префікс ./.

Отже, за допомогою скриптів будь-яку взаємодію з оболонкою можна автоматизувати. 

Що таке Bash?

Як ми вже згадували, Bash є інтерпретатором за умовчанням у багатьох системах GNU/Linux, тому ми використовували його, навіть не підозрюючи про це. Ось чому наш попередній скрипт Shell працює навіть без визначення Bash як інтерпретатора. Щоб побачити, який у вас інтерпретатор за умовчанням, виконайте команду:

$ echo $SHELL
/bin/bash

Доступні різні інтерпретатори оболонки, такі як оболонка Korn, оболонка C та інші. Тому рекомендується визначати інтерпретатор оболонки, який використовуватиметься для інтерпретації вмісту скрипту.

Щоб визначити інтерпретатор вашого скрипту як Bash, спочатку знайдіть повний шлях до його бінарного виконуваного файлу. Це можна зробити за допомогою команди which, додайте до неї префікс #! і вставте його як перший рядок вашого скрипту. Існують й інші методи визначення інтерпретатора оболонки, але для початку і цього достатньо.

Відтепер усі наші сценарії включатимуть визначення інтерпретатора оболонки #!/bin/bash.

Як створити скрипт?

Щоб почати створювати скрипти, вам потрібен лише текстовий редактор. Для прикладу, ми створюємо простий сценарій за допомогою редактора.

  1. Створіть і відкрийте сценарій 
    Створіть скрипт під назвою greetings.sh і відкрийте його в редакторі.
    #!/bin/bash
    Перша частина сценарію, як уже згадувалося раніше, — це шебанг (#!). Ця послідовність дозволяє скрипту повідомляти інтерпретатору, що він повинен використовувати для розуміння коду.
    Далі напишемо коментар. Це дозволить кожному, хто використовує сценарій, зрозуміти, для чого призначений код. Коментарі можна додати до скрипту, поставивши символ #.
    # My first Linux script
  2. Пишемо «Hello World»
    Щоб надрукувати будь-який вихід, ми використовуємо команду echo в bash. Якщо ви хочете написати «Hello world», команда має виглядати так:
    echo "Hello world"
  3. Зробіть так, щоб скрипт виконувався
    Для цього використайте команду chmod.
    chmod +x greetings.sh
    Саме +x означає, що ви додаєте дозвіл на виконання до файлу скрипту. Щоб запустити сценарій, викличте ім’я сценарію з його відносним шляхом:
    ./greetings.sh

Тепер ви знаєте, як написати базовий приклад «Hello World». Що далі? Щоб отримати глибші знання — ознайомтеся з колекцією Awesome Shell та офіційним довідником GNU з Bash.

Корисні Shell скрипти

  • Можливо ви знаєте просту команду, що показує зовнішній IP: 
    $ curl ifconfig.co
    Це ідеальний варіант, якщо ви входите до мережі через роутер. Все, що вона робить, просто звертається до сервера ifconfig.co, який повертає назад IP одним рядком замість повноцінної вебсторінки.
    Щоб перетворити команду на скрипт, достатньо помістити її в текстовий файл і додати шебанг, тобто символи #!, за якими слідує ім’я командного інтерпретатора:
    #!/bin/bash
    curl ifconfig.co

    Далі скрипт зберігаємо в каталог ~/bin та призначаємо права на виконання:
    $ chmod +x ~/bin/myip.sh
    Тепер його можна викликати із командного рядка за допомогою myip.sh.
  • Наступний скрипт дозволяє отримати звіт погоди на чотири дні. Принцип тут такий самий, як і з ifconfig.co.
    #!/bin/sh
    curl -4 wttr.in/Kyiv
  • Скрипт, вказаний нижче, створює архів tar.gz поточного каталогу. Особливої уваги тут заслуговує конструкція ${PWD##*/}, яка бере повний шлях до поточного каталогу (змінна $PWD) і видаляє з нього першу частину аж до останнього слешу, залишаючи тільки ім’я самого каталогу. Далі до нього додається розширення tar.gz.
    #!/bin/sh
    tar -czf "../${PWD##*/}.tar.gz" .

  • Це скрипт для запуску та зупинки торрент-клієнта під час простою машини:
    #!/bin/bash

    IDLE=600000
    STOPCMD="transmission-remote -S"
    STARTCMD="transmission-remote -s"

    STOPPED="yes"
    while true; do
        if [ `xprintidle` -gt $IDLE ]; then
            if [ $STOPPED = "yes" ]; then
                $STARTCMD
                STOPPED="no"
            fi
        else
            if [ $STOPPED = "no" ]; then
                $STOPCMD
                STOPPED="yes"
            fi
        fi
        sleep 60
    done

    Скрипт уходить в нескінченний цикл, кожну хвилину перевіряючи, скільки мілісекунд пройшло з моменту, коли користувач щось робив (для цього використовується команда xprintidle). Якщо вже минуло 600 000 мс (10 хв), скрипт виконує команду, вказану в змінній STARTCMD. В іншому випадку він виконає команду STOPCMD, але тільки тоді, коли до неї було виконано команду STARTCMD. Якщо коротко: нічого не робите за комп’ютером десять хвилин — запускається STARTCMD, в цьому випадку це команда запуску всіх завантажень за допомогою Transmission, якщо ні — всі завантаження призупиняються. Не любите Transmission? Немає проблем, ось команди для Deluge:
    STOPCMD="deluge-console pause \*"
    STARTCMD="deluge-console resume \*"

Як писати ефективні скрипти Bash у Linux: 5 корисних порад

  1. Використовуйте коментарі
    Це рекомендована практика, яка застосовується не лише до Shell скриптів, а й до всіх інших видів програмування. Коментарі допомагають вам або іншим людям, які вивчають ваш сценарій, зрозуміти, що роблять різні його частини.
    Нагадаємо, що коментарі визначаються за допомогою #.
  2. Не забувайте виходити зі сценарію
    Іноді Bash може продовжувати виконувати скрипт, навіть якщо певна команда не виконується, впливаючи на решту сценарію. Це може призвести до логічних помилок. Використовуйте наведений нижче рядок, щоб вийти зі сценарію, коли команда не виконується:
    #let script exit if a command fails
    set -o errexit 
  3. Використовуйте подвійні лапки
    Для посилань на змінні використовуйте подвійні лапки, адже вони допомагають запобігти розбиванню слів тощо.
  4. Використовуйте функції в скриптах
    За винятком дуже маленьких сценаріїв (з кількома рядками коду), завжди пам’ятайте про використання функцій. Це потрібно, щоб модулювати свій код і зробити скрипти більш читабельними та зручними для повторного використання.
    Синтаксис запису функцій такий:
    function check_root(){
    command1; 
    command2;
    }

    Для однорядкового коду використовуйте символи завершення після кожної команди:
    check_root(){ command1; command2; }
  5. Використовуйте $(command)
    Підставляння команди замінює команду на її виведення. Використовуйте $(command) замість `command` для цієї дії.

Хочете більш детально та системно розібратися у Shell й інших видах системних оболонок, текстових редакторах nano, vi/vim, mcedit та дізнатися ще багато корисного? Пройдіть курс «Адміністрування Linux для новачків» від IT Education Center. Щоб ознайомитися із програмою та записатися, тисніть сюди

Залишити відповідь

Дякуємо, що поділились