Home Dokumentacje Bash w przykładach - część pierwsza
22 | 08 | 2019
Bash w przykładach - część pierwsza
Wpisany przez Daniel Robbins   

Uwaga: Oryginalna wersja tego artykułu została opublikowana w IBM developerWorks i jest własnością Westtech Information Services. Poniższy dokument jest poprawioną przez zespół GDP wersją oryginalnego tekstu i nie jest już aktualizowany.

Bash w przykładach - część pierwsza

Daniel Robbins Autor
Waldemar Korłub Tłumacz

Zaktualizowano 9 października 2005

1. Podstawy programowania w Bourne again shell (bash)

Wprowadzenie

Dlaczego powinniśmy uczyć się programowania w bashu? Poniżej znajduje się kilka powodów:

Bash już działa w naszym systemie

Gdybyśmy to sprawdzili, prawdopodobnie okazałoby się, że w tym momencie bash działa w naszym systemie. Nawet jeśli zmieniliśmy domyślną powłokę, bash prawdopodobnie i tak działa, ponieważ jest to standardowy shell Linuksa i system używa go do rozmaitych działań. W związku z tym, że bash już działa, wszystkie dodatkowe skrypty, jakie uruchomimy nie będą właściwie zajmowały dodatkowej pamięci, gdyż dzialą one pamięć z działającymi już procesami basha. Po co więc ładować inny interpreter, jeśli już działa w naszym systemie coś, co wykona pracę i w dodatku zrobi to dobrze?

Już korzystamy z basha

Nie tylko bash działa w naszym systemie. Każdego dnia używamy go. Bash zawsze nam towarzyszy, więc warto nauczyć się wykorzystywać jego pełny potencjał. Dzięki temu korzystanie z systemu będzie przyjemniejsze i bardziej produktywne. Dlaczego jednak uczyć się programowania w bashu? To proste - już myślimy w kategoriach wykonywania komend, kopiowania plików, tworzenia strumieni i przekierowań. Warto jest uczyć się języka, który umożliwia wykorzystanie znanych nam już potężnych i pozwalających na oszczędzenie czasu narzędzi. Powłoki udostępniają nam potencjał systemu UNIX, a bash jest powłoką Linuksa. Jest wysokopoziomowym pośrednikiem pomiędzy nami i komputerem. Poszerzając wiedzę o bashu zwiększamy produktywność naszej pracy w systemach Linux i UNIX.

Pozorny nieład basha

Nauka basha w niewłaściwy sposób może wywołać wrażenie pozornego nieładu w jego strukturach. Wielu początkujących użytkowników wpisuje man bash w celu wyświetlenia strony man basha. Jednak tam znajdują się lakoniczne i bardzo techniczne opisy jego funkcjonalności. Inni używają info bash, co daje efekt w postaci wyświetlenia strony man lub tylko odrobinę bardziej przyjaznej dokumentacji.

Choć początkujący użytkownicy mogą czuć się zawiedzeni, trzeba pamiętać, że dokumentacja basha nie może być "wszystkim dla wszystkich" i jest skierowana do osób, które są już zaznajomione z programowaniem powłoki. Z całą pewnością strona man basha zawiera wiele przydatnych informacji technicznych, jednak dla początkującego użytkownika, są one niemal bezużyteczne.

Ta krótka seria jest przeznaczona właśnie dla początkujących, którzy chcą nauczyć się stosowania podstawowych konstrukcji basha do budowy własnych skryptów. Zamiast technicznych opisów można tu znaleźć wyjaśnienia w przystępnym języku, dzięki czemu nie tylko będziemy wiedzieli co robi dany element, ale także w jakich sytuacjach powinniśmy go stosować. Po przebrnięciu przez ten kurs, będziemy w stanie pisać własne złożone skrypty - osiągniemy poziom na którym korzystanie z basha stanie się dla nas komfortowe. Ponadto będziemy mogli dalej rozwijać swoje umiejętności poprzez czytanie (i rozumienie) standardowej dokumentacji basha. Zaczynajmy.

Zmienne środowiskowe

Korzystając z basha (i prawie wszystkich innych powłok), użytkownik może definiować zmienne środowiskowe, które tworzone są wewnętrznie jako łańcuchy znaków ASCII. Jedną z najbardziej przydatnych właściwości zmiennych środowiskowych jest to, że są one standardową częścią modelu działania UNIX-a. Oznacza to, że zmienne środowiskowe są dostępne nie tylko dla skryptów shella, ale również mogą zostać wykorzystane przez skompilowane programy. Gdy wyeksportujemy zmienną środowiskową, każdy uruchomiony program będzie mógł odczytać nasze ustawienia, niezależnie od tego czy jest to skrypt shella czy nie. Dobrym przykładem jest tu użycie komendy vipw, która pozwala użytkownikowi root edycję plików systemowych z hasłami. Poprzez ustawienie w zmiennej środowiskowej EDITOR nazwy ulubionego edytora, możemy skonfigurować vipw, aby korzystało w niego zamiast z vi. Jest to przydatne jeśli nie lubimy vi lub wolimy używać innego edytora.

Standardowym sposobem zdefiniowania zmiennej środowiskowej w bashu jest wpisanie komendy:

Listing 1.1: Definiowanie zmiennej środowiskowej

$ myvar='To moja zmienna środowiskowa!'

Powyższa komenda definiuje zmienną środowiskową o nazwie "myvar", zawierającą łańcuch "To moja zmienna środowiskowa!". Należy zwrócić uwagę na kilka kwestii: po pierwsze, nie ma żadnych białych znaków (spacja, znak tabulacji) po obu stronach znaku =; jakakolwiek przewra spowoduje błąd. Druga sprawa to możliwość pominięcia znaków cudzysłowu w sytuacji, gdy przypisujemy zmiennej jako wartość jedno słowo (ciąg niezawierający białych znaków). Cudzysłów jest konieczny, jeśli wartość zmiennej zawiera więcej niż jedno słowo.

Uwaga: Aby uzyskać bardziej szczegółowe informacje o użyciu znaków cudzysłowu w bashu, należy zapoznać się z sekcją "QUOTING" na stronie man basha. Istnienie specjalnych sekwencji znaków, które bash zastępuje przez inne wartości, komplikuje obsługę łańcuchów. W tej serii artykułów przedstawimy tylko najczęściej używane fonkcjonalności znaków cudzysłowu.

Po trzecie, o ile zazwyczaj możemy używać podwójnych znaków cudzysłowu zamiast pojedynczych, próba dokonania tego w powyższym przykładzie spowoduje błąd. Dlaczego? Ponieważ podwójne znaki cudzysłowu umożliwiają bashowi dokonanie ekspansji, podczas której specjalne znaki i sekwencje znaków zostają zastąpione odpowiednimi wartościami. Na rzykład znak "!" jest symbolem ekspansji historii basha i zazwyczaj zostaje zastąpiony ostatnio wpisaną komendą (w tej serii artykułów nie opiszemy możliwości ekspansji historii, ponieważ nie jest to często wykorzytywana właściwość basha; więcej informacji na ten temat można uzyskać w sekcji "HISTORY EXPANSION" na stronie man basha). Funkcje te (nazywane funkcjami macro) mogą być bardzo pomocne, jednak w tym momencie zależy nam na umieszczeniu prostego literału na końcu zmiennej środowiskowej.

Teraz zobaczmy w jaki sposób można korzystać ze zmiennych środowiskowych. Oto przykład:

Listing 1.2: Używanie zmiennych środowiskowych

$ echo $myvar
To moja zmienna środowiskowa!

Poprzez poprzedzenie nazwy zmiennej środowiskowej znakiem $, nakazujemy powłoce bash zastąpienie tego wywołania wartością zmiennej. W terminologii basha nazywane jest to ekspansją zmiennych. Jednak co się stanie jeśli spróbujemy wykonać komendę:

Listing 1.3: Próba użycia ekspansji zmiennych

$ echo foo$myvarbar
foo

Chcieliśmy uzyskać na wyjściu napis "fooTo moja zmienna środowiskowa!bar", jednak polecenie nie powiodło się. Co poszło źle? Ekspansja zmiennych nie była w stanie poprawnie zadziałać. Nie było możliwe określenie czy chcemy dokonać ekspansji zmiennej $,m ,$my, $myvar, $myvrbar czy jeszcze jakiejś innej. Musimy bardziej precyzyjnie określić o jaką zmienną nam chodzi. Spróbujmy wykonać polecenie:

Listing 1.4: Prawidłowe użycie ekspansji zmiennych

$ echo foo${myvar}bar
fooTo moja zmienna środowiskowa!bar

Jak widać, możemy objąć nazwę zmiennej środowiskowej nawiasami klamrowymi, gdy nie jest ona oddzielona od otaczającego ją tekstu w inny sposób. Podczas gdy "$myvar" jest szybsze do wpisania i będzie poprawnie działać w większości przypadków, "${myvar}" zostanie właściwie zinterpretowane w prawie każdej sytuacji. Obie formy dają taki sam efekt i obie będą wykorzystywane w dalszej części artykułu. Należy zapamiętać, że gdy nazwa zmiennej środowiskowej nie jest oddzielona od otaczającego tekstu białymi znakami, należy ująć ją w nawiasy klamrowe.

Wspomnieliśmy wcześniej, że możliwe jest wyeksportowanie zmiennych. Gdy tego dokonujemy, zmienna staje się automatycznie dostępna dla wszystkich działających programów i skryptów. Te drugie mogą uzyskać dostęp do zmiennych środowiskowych poprzez ich obsługę wbudowaną w powłokę. Natomiast programy w języku C mogą skorzystać z funkcji getenv(). Poniżej znajduje się przykładowy kod źródłowy, który warto przekopiować do pliku i skompilować - pozwala on na zrozumienie zagadnienia zmiennych środowiskowych z perspektywy języka C.

Listing 1.5: myvar.c - prosty program w języku C korzystający ze zmiennej środowiskowej

#include <stdio.h>
#include <stdlib.h>

int main(void) {
  char *myenvvar=getenv("EDITOR");
  printf("Zmienna środowiskowa EDITOR posiada wartość %s\n",myenvvar);
}

Zapiszmy powyższy kod źródłowy w pliku o nazwie myenv.c i skompilujmy do przy użyciu komendy:

Listing 1.6: Kompilacja powyższego programu

$ gcc myenv.c -o myenv

Teraz w aktualnym katalogu znajduje się program, który po uruchomieniu wyświetli wartość zmiennej środowiskowej EDITOR, jeśli została ona określona. Na moim komputerze daje to efekt:

Listing 1.7: Uruchomienie powyższego programu

$ ./myenv
Zmienna środowiskowa EDITOR posiada wartość (null)

Ponieważ wartość zmiennej środowiskowej EDITOR nie została określona, program otrzymuje pusty łańcuch. Spróbujmy ustawić wartość dla zmiennej EDITOR i jeszcze raz uruchomić program:

Listing 1.8: Próba z określoną zmienną środowiskową

$ EDITOR=xemacs
$ ./myenv
Zmienna środowiskowa EDITOR posiada wartość (null)

Choć mogło wydawać się, że program wypisze wartość "xemacs", ponownie zwrócił on wartość pustą. Stało się tak, ponieważ nie wyeksportowaliśmy zmiennej EDITOR. Tym razem powinno się udać:

Listing 1.9: Wywołanie programu po wyeksportowaniu zmiennej

$ export EDITOR
$ ./myenv
Zmienna środowiskowa EDITOR posiada wartość xemacs

Na tym przykładzie widzimy, że inne procesy (w tym przypadku nasz program w języku C) nie widzą zmiennych środowiskowych nim nie zostaną one wyeksportowane. Zdefiniowania i wyeksportowania zmiennej środowiskowej można dokonać przy użyciu jednej komendy:

Listing 1.10: Zdefiniowanie i wyeksportowanie zmiennej środowiskowej w jednej komendzie

$ export EDITOR=xemacs

Działa to identycznie jak dwie oddzielne komendy. Przyszedł czas na przedstawienie sposoby na usunięcie wartości zmiennej środowiskowej przy użyciu polecenia unset:

Listing 1.11: Usuwanie wartości zmiennej

$ unset EDITOR
$ ./myenv
Zmienna środowiskowa EDITOR posiada wartość (null)

Przegląd sposobów rozrywania łańcuchów

Rozrywanie łańcuchów - dzielenie ich na mniejsze, oddzielne fragmenty - jest jednym z tych zadań, które jest wykonywane każdego dnia przez skrypty powłoki. Wiele razy sprypt pobiera pełną ścieżkę, aby określić nazwę wykonywanego pliku lub katalogu, w którym się on znajduje. Podczas gdy jest możliwe (i przyjemne!) napisanie tego w bashu, standardowa komenda UNIX-a basename radzi sobie w tej sytuacji idealnie:

Listing 1.12: Używanie basename

$ basename /usr/local/share/doc/foo/foo.txt
foo.txt
$ basename /usr/home/drobbins
drobbins

basename jest bardzo przydatnym narzędziem do dzielenia łańcuchów. Jego przeciwieństwo, czyli dirname zwraca pozostałą część ściżki, którą odrzuca basename:

Listing 1.13: Używanie dirname

$ dirname /usr/local/share/doc/foo/foo.txt
/usr/local/share/doc/foo
$ dirname /usr/home/drobbins/
/usr/home

Uwaga: Zarówno działanie dirname jak i basename nie odnosi się do żadnych istniejących (lub nie) katalogów i plików na dysku. Polecenia te wyłącznie manipulują łańcuchami, jakie otrzymają w postaci argumentu.

Podstawianie komend

Inną bardzo przydatną umiejętnością jest przekazanie rezultatu wykonania komendy do zmiennej środowiskowej. Jest to bardzo proste do zrobienia:

Listing 1.14: Tworzenie zmiennej środowiskowej zawierającej wynik działania komendy

$ MYDIR=`dirname /usr/local/share/doc/foo/foo.txt`
$ echo $MYDIR
/usr/local/share/doc/foo

To co zrobiliśmy powyżej nazywane jest podstawianiem komend. Warto zwrócić tutaj uwagę na kilka rzeczy. W pierwszej linii objeliśmy podstawianą komendę odwróconymi apostrofami. Nie jest to zwykły pojedynczy cudzysłów, ale symbol, który na klawiaturze znajduje się zazwyczaj na przyciskiem tabulacji (na tym samym klawiszu co tylda). Możemy wykonać dokładnie to samo działanie przy użyciu alternatywnej składni podstawiania poleceń basha:

Listing 1.15: Alternatywna składnia podstawiania poleceń

$ MYDIR=$(dirname /usr/local/share/doc/foo/foo.txt)
$ echo $MYDIR
/usr/local/share/doc/foo

Jak widać bash dostarcza wielu sposobów na wykonanie dokładnie tych samych działań. Używając podstawiania komend możemy umieścić dowolną komendę lub strumień komend pomiędzy znakami ` ` lub $( ) i przypisać dzięki temu ich wynik do zmiennej środowiskowej. To bardzo przydatna właściwość! Poniżej znajduje się przykład wykorzystania podstawiania komend w odniesieniu do strumieni:

Listing 1.16: Podstawianie strumienia komend

$ MYFILES=$(ls /etc | grep pa)
$ echo $MYFILES
pam.d passwd

Zaawansowane rozrywanie łańcuchów

basename i dirname to bardzo przydatne narzędzia, jednak może zdarzyć się tak, że będziemy potrzebować bardziej zaawansowanych funkcji dzielenia łańchuchów, niż zwykłe manipulacje na ścieżkach. W takiej sytuacji możemy skorzystać z zaawansowanych możliwości basha w dziedzinie ekspansji zmiennych. Używaliśmy już standardowego sposobu ekspansji zmiennych, który ma postać ${MYVAR}. Bash oferuje jednak kilka przydatnych spsobów rozrywania zmiennych poddawanych ekspansji. Popatrzmy na następujące przykłady:

Listing 1.17: Przykłady rozrywania łańcuchów

$ MYVAR=foodforthought.jpg
$ echo ${MYVAR##*fo}
rthought.jpg
$ echo ${MYVAR#*fo}
odforthought.jpg

W pierwszym przykładzie nakazaliśmy wyświetlenie efektu działnia ekspansji zdefiniowanej jako ${MYVAR##*fo}. Co dokładnie oznacza tego typu ekspansja zmiennej? Wewnątrz ${ } wpisaliśmy nazwę zmiennej środowiskowej, znaki ## i wyrażenie *fo. Bash odnalazł w zmiennej MYVAR najdłuższy ciąg znaków pasujący do wyrażenia *fo i usunął go z początku łańcucha. Jest to nieco trudne do zrozumienia za pierwszym razem, więc aby poznać działanie znaków ## przyjrzyjmy się w jaki sposób bash przeprowadził tą ekspansję. Zaczął on sprawdzać od początku łańcuch "foodforthought.jpg" w poszukiwaniu fragmentów, które pasują do wyrażenia .*fo. Oto kolejne etapy sprawdzania zmiennej środowiskowej:

Listing 1.18: Sprawdzanie łańcucha

f
fo              ODPOWIADA *fo
foo
food
foodf
foodfo          ODPOWIADA *fo
foodfor
foodfort
foodforth
foodfortho
foodforthou
foodforthoug
foodforthought
foodforthought.j
foodforthought.jp
foodforthought.jpg

Jak widać, bash znalazł dwa fragmenty odpowiadające naszemu wyrażeniu. Wykorzystanie znaków ## podczas ekspansji zmiennej nakazuje wybranie najdłuższego z pasujących ciągów. Gdy został on prawidłowo zidentyfikowany, bash usunął go z początku zmiennej i zwrócił pozostałą część.

Drugi przykład ekspansji zmiennej jest taki sam jak pierwszy poza wykorzystaniem pojedynczego znaku #, zamiast dwóch takich znaków w pierwszym przypadku. Bash przeprowadza tutaj niemal identyczny proces. Sprawdzane są te same fragmenty łańcucha co poprzednio, jednak z początku zmiennej usunięty zostaje najkrótszy ciąg pasujący do wyrażenia *fo. Więc gdy tylko bash sprawdzi fragment "fo", usuwa go i zwraca "odforthought.jpg".

Początkowo trudnym do zapamiętania może wydawać się kiedy korzystamy z #, a kiedy z ##. Istnieje prosty sposób aby to przyswoić. Szukając najdłuższego fragmentu łańcuch, używamy ##, bo jest dłuższe niż #. Analogicznie najkrótszy fragment odnajdziemy przy użyciu #. Jednak w jaki sposób zapamiętać, że # usunie znaki z początku zmiennej? Bardzo prosto - na klawiaturach typu us wciśnięcie shift+4 daje znak $, symbolizyjący ekspansję zmiennych. Na lewo od tego znaku na klawiaturze znajduje się znak #. Widać że # jest "na początku" $, więc służy on do usuwania znaków z początku zmiennej. Jeśli zastanawiamy się w jaki sposób usunąć znaki z końca łańcucha wystarczy spojrzeć na prawo od znaku $ na klawiaturze - służy do tego znak %. Poniżej kilka przykładów jego wykorzystania:

Listing 1.19: Inny sposób dzielenia łańcuchów

$ MYFOO="chickensoup.tar.gz"
$ echo ${MYFOO%%.*}
chickensoup
$ echo ${MYFOO%.*}
chickensoup.tar

Jak widać, opcje ekspansji zmiennych % i %% działają tak, jak # oraz ##, jednak usuwają pasujący do podanego wyrażenia fragment zmiennej z jej końca. Należy przy tym pamiętać, że nie jest konieczne użycie znaku *, jeśli chcemy usunąć ściśle określony fragment zmiennej.

Listing 1.20: Usuwanie znaków z końca łańcucha

MYFOOD="chickensoup"
$ echo ${MYFOOD%%soup}
chicken

W tym przypadku nie ma znaczenia czy użyjemy %% czy %, gdyż tylko jeden fragment odpowiada podanemy wyrażeniu. Jeśli nie będziemy pamiętali czy powinniśmy użyć # czy %, można spojrzeć na klawisze 3, 4, 5 - układ znaków symbolicznie odpowiada funkcjom przez nie pełnionym.

Ekspansja zmiennych pozwala także na pobranie określonego przez nas fragmentu łańcucha, na podstawie indeksu pierwszego znaku jaki ma znaleźć się w wycinku i jego długości. Spróbujmy wprowadzić następujące komendy:

Listing 1.21: Wybór fragmentu łańcucha

$ EXCLAIM=cowabunga
$ echo ${EXCLAIM:0:3}
cow
$ echo ${EXCLAIM:3:7}
abunga

Ten sposób dzielenia łańcuchów może okazać się bardzo przydatny. Wystarczy podać indeks znaku od którego zacznie się tworzenie wycinka (pierwszy znak ma indeks 0 - jak w pierwszym przykładzie) i ilość znaków jaką ma on zawierać (wszystkie informacje rozdzielone dwukropkami).

Implementacja rozrywania łańcuchów

Gdy poznaliśmy sposoby rozrywania łańcuchów, napiszmy prosty skrypt. Nasz skrypt będzie przyjmował jeden argument w postaci nazwy pliku i wyświetlał informacje czy jest to tarball czy też nie. Plik jest tarballem, jeśli na końcu jego nazwy znajduje się ciąg ".tar". Oto skrypt:

Listing 1.22: mytar.sh - przykładowy skrypt

#!/bin/bash

if [ "${1##*.}" = "tar" ]
then
       echo Plik jest tarballem.
else
       echo Na pierwszy rzut oka plik nie wygląda na tarballa.
fi

Aby wykonać skrypt, należy skopiwać jego kod do pliku mytar.sh i wykonać komendę chmod 755 mytar.sh, co nada mu prawo do wykonywania. Następnie wykonujemy skrypt jak poniżej:

Listing 1.23: Wypróbowanie skryptu

$ ./mytar.sh thisfile.tar
Plik jest tarballem.
$ ./mytar.sh thatfile.gz
Na pierwszy rzut oka plik nie wygląda na tarballa.

Skrypt działa, jednak nie jest zbyt funkcjonalny. Zanim sprawimy, że stanie się on bardziej przydatny, przyjrzyjmy się konstrukcji if w kodzie skryptu. Znajduje się w niej wyrażenie typu boolean. W bashu operator porównania = sprawdza czy łańcuchy po obu jego stronach są takie same. Wszystkie wyrażenia typu boolean należy umieszczać w nawiasach kwadratowych. Co dokładnie jest obiektem wyrażenia typu boolean? Popatrzmy na jego lewą stronę. Zgodnie z tym czego się do tej pory nauczyliśmy, konstrukcja ${1##*.} usunie z początku łańcucha, znajdującego się w zmiennej środowiskowej 1, najdłuższy fragment pasujący do wzorca *. i zwróci pozostałą jego część. Otrzymamy w ten sposób znaki snajdujące się po ostatniej kropce. Oczywiste jest, że jeśli nazwa pliku kończy się ciągiem ".tar", wynikiem tej operacji będzie ciąg "tar", który w porównaniu z p-wartością (wartością po prawej stronie operatora porównania) da wynik całego wyrażenia w postaci prawdy.

Być może nie jest do końca jasne czym tak naprawdę jest zmienna środowiskowa o nazwie 1. To bardzo proste - $1 to pierwszy argument skryptu podany w wierszu poleceń, $2 to drugi argument itd. Przeanalizowaliśmy już wyrażenie typu boolean, jakie pojawiło się z naszym skrypcie. Przyjrzyjmy się teraz bliżej konstrukcji if.

Konstrukcja if

Jak większość języków, bash ma swoje własne konstrukcje warunkowe. Podczas ich używania należy trzymać się formatu jaki pokazano w przykładzie powyżej: if oraz then muszą znajdować się w oddzielnych liniach, ponadto te słowa kluczowe oraz else i fi (które musi znaleźć się na końcu każdej konstrukcji warunkowej), należy wyrównać w ten sam sposób. Czyni to kod łatwiejszym do czytania i debugowania. Poza podstawową formą "if,else", konstrukcja warunkowa może przyjmować bardziej złożone postacie.

Listing 1.24: Podstawowa forma konstrukcji if

if      [ warunek ]
then
        akcja
fi

Konstrukcja if w takiej formie wykona jakąś akcję tylko jeśli warunek jest prawdziwy, w przeciwnym razie nie zostaną podjęte żadne czynności i wykonanie skryptu będzie kontynuowane w liniach po kończącym fi.

Listing 1.25: Sprawdzanie dodatkowych warunków

if [ warunek ]
then
        akcja
elif [ warunek2 ]
then
        akcja2
.
.
.
elif [ warunek3 ]
then
        akcja3
else
        akcjax
fi

Zastosowana powyżej formuła elif będzie sprawdzać kolejne warunki i wykona akcje odpowiadające pierwszemu warunkowi, który zostanie określony jako prawdziwy. Gdy żaden z warunków nie będzie prawdziwy, wykonane zostaną akcje z sekcjielse, jeśli taka występuje (w powyższym przykadzie występuje). Po tych czynościach wykonanie skryptu będzie kontynuowane w liniach znajdujących się po całej konstrukcji "if,elif,else".

Kolejna część kursu

Kiedy poznaliśmy już podstawowe funkcjonalności basha, czas podnieść poprzeczkę i przygotować się do pisania prawdziwych skryptów. W drugim artykule z tej serii przedstawimy pętle, funkcje, przestrzenie nazw i inne fundamentalne zagadnienia. Dzięki temu będziemy gotowi do pisania bardziej złożonych skryptów. Trzeci (i zarazem ostatni) artykuł tego kursu skupia się niemal wyłącznie na skomplikowanych skryptach i funkcjach, a także na opisie kilku strategii projektowych.

2. Zasoby informacji

Przydatne linki

 

 
Linki sponsorowane

W celu realizacji usług i funkcji na witrynach internetowych ZUI "ELPRO" stosujemy pliki cookies. Korzystanie z witryny bez zmiany ustawień dotyczących plików cookies oznacza, że będą one zapisywane w urządzeniu wyświetlającym stronę internetową. Więcej szczegółów w Polityce plików cookies.

Akceptuję pliki cookies z tej witryny.