[KURS] Programowanie w powłoce #1

[KURS] Programowanie w powłoce #1
Poniekąd z obowiązku, ale również z ciekawości, postanowiłem pojąć podstawy (póki co) programowania w powłoce. Nie jestem samolubny, więc będę się z Wami dzielić wiedzą w dosyć przystępny (mam nadzieję) sposób.

Bash to jedna z najpopularniejszych powłok systemów uniksowych.

Skrypt to zwykły nieskompilowany plik tekstowy, zawierający różne instrukcje, polecenia systemowe, do wykonania przez zdefiniowany w skrypcie interpreter powłoki systemowej (/bin/bash). Zadaniem powłoki jest przetłumaczenie ich na polecenia systemu.

W pierwszej części kursu przedstawię sposób tworzenia i wykonania skryptu oraz podstawowe operacje wejścia i wyjścia.

Aby utworzyć skrypt potrzebny będzie Ci dowolny edytor tekstu (w moim przypadku Gedit) + konsola (skoro programujemy w powłoce to nie sposób od niej uciec).

Tworzenie skryptu

Otwórz terminal i wydaj polecenie:

gedit skrypt

Każdy skrypt powinien na początku zdefiniowany rodzaj powłoki, w której ma być wykonany. W naszym przypadku będzie to:

#!/bin/bash

Skrypt powinien również zakończyć się instrukcją:

exit 0

co oznacza, że skrypt zwróci wartość 0, gdy wykona się poprawnie. Pomiędzy tymi linami znajdować będzie się nasz skrypt.

Wykonanie skryptu

Zanim wykonasz skrypt, musisz nadać mu prawa do uruchamiania. Zrobisz to poleceniem:

chmod +x ścieżka_do_skryptu

Tak przygotowany skrypt uruchomisz wpisując w terminalu ścieżkę do skryptu:

ścieżka_do_skryptu/nazwa_skryptu

Jeśli znajdujesz się w katalogu, w którym znajduje się skrypt:

./nazwa_skryptu

Podstawowe operacje wejścia i wyjścia

echo – wydrukowanie na standardowym wyjściu (domyślnie jest to ekran) napisu.

Dodatkowe parametry

  • -n nie jest wysyłany znak nowej linii
  • -e włącza interpretację znaków specjalnych takich jak:
    • \a dzwonek systemowy
    • \b backspace
    • \c pomija znak kończący nowej linii
    • \f escape
    • \n form feed czyli wysuw strony
    • \r znak nowej linii
    • \t tabulacja pozioma
    • \v tabulacja pionowa
    • \\ backslash
    • \nnn znak, którego kod ASCII ma wartość ósemkowo
    • \xnnn znak, którego kod ASCII ma wartość szesnastkowo

Przykład:

#!/bin/bash

i=Hello

echo "Hello world!" #wariant nr 1
echo Hello world! #wariant  nr 2
echo $i #wariant nr 3
echo "$i" #wariant nr 4
echo "$i world!" #wariant nr 5 
echo $i world #wariant nr 6

exit 0

Na ekranie powinieneś ujrzeć napis:

Hello world!
Hello world!
Hello
Hello
Hello world!
Hello world

Jak widać tekst można wyświetlić na wiele sposobów. Najestetyczniejszy z nich to ujęcie wypisywanej frazy w cudzysłów (wariant nr 1). Do wypisywania wartości zmiennej najlepiej użyć wariantu nr 4, a do wypisania zarówno tekstu jak i wartości zmiennej – wariantu nr 5.

W powyższym przykładzie użyłem znaku #, który służy do dodawania komentarzy. Interpreter pomija wszystko co znajduje się za tym znakiem aż do końca linii

Przykład zastosowania polecenia echo z dodatkowym parametrem:

echo -e "Kazde\nslowo\nw\nnowej\nlinii\na do tego dzownek\a"

read – czyta ze standardowego wejścia pojedynczy wiersz.

Dodatkowe parametry:
-p pokaże znak zachęty bez kończącego znaku nowej linii
-e kolejne wartości przypisywane są do kolejnych indeksów zmiennej tablicowej
-a jeśli nie podano żadnej nazwy zmiennej, wiersz trafia do $REPLY.

Przykład

#!/bin/bash

echo -n "Podaj swoje imie: "
read imie
echo "Witaj, $imie!"

exit 0

Rezultat:

Podaj swoje imie: Lukasz
Witaj, Lukasz!

Jak widać, funkcja read jest bardzo prosta i nie wymaga raczej dłuższego komentarza. Cały skrypt można również zapisać prościej:

#!/bin/bash

read -p "Podaj imie: " imie
echo "Witaj, $imie"

exit 0

Przykład zastosowania polecenia read z dodatkowym parametrem:

#!/bin/bash

read -p "Podaj imie: " -e
echo "Witaj, $REPLY"

exit 0

To tyle w tej części. Kolejne artykuły będą ukazywać się dość nieregularnie, więc nie mogę obiecać kiedy pojawi się nowy artykuł i co w nim będzie :)

Jeżeli powyższy artykuł nie rozwiązał lub rozwiązał częściowo Twój problem, dodaj swój komentarz opisujący, w którym miejscu napotkałeś trudności.
Mile widziane komentarze z uwagami lub informacjami o rozwiązaniu problemu.
  • Admc

    Niczego nowego się nie dowiedziałem. Czekam na wpis o if i then.

    • Szmitas

      Instrukcje warunkowe planuję na trzeci wpis.

      • buba

        jakoś nigdy nie mogłem zabrać się żeby pouczyć trochę tego programowania w bashu to myślę że te artykuły to będzie dobry początek

  • Enlik

    > echo $i #wariant nr 3
    > Do wypisywania wartości zmiennej najlepiej użyć wariantu nr 3,

    To ja proponuję zrobić eksperyment.

    read zmienna
    # wpiszcie *

    echo $zmienna
    echo „$zmienna”

    To drugie jest na ogół tym, czego oczekuje użytkownik.

    Na ostatek:
    echo ‚$zmienna’

    to tyle ;)

    • Szmitas

      A poza gwiazdką są jeszcze inne haczyki?

      • Enlik

        Tak – to zwykłe glob expansion.
        Masz gwiazdkę i pytajnik.
        Jeśli masz takie pliki w bieżącym katalogu:

        abc def ghi

        i uruchomisz
        read x; echo $x

        i wpiszesz
        a*

        wynikiem będzie:
        abc


        W 99% przypadkach jak używa się echo (ale też np. tutaj:
        [ „$var1” = „$var2” ]
        powinien być zastosowany podwójny cudzysłow.
        Bez tego:
        [ $var1 = „$var2” ]
        (wewnątrz [ i ]) takie znaki w $var1 również byłyby w podobny sposób zinterpretowane.

        Pozdrawiam.