Witaj w kursie programowania w języku Bash! Bash (Bourne Again SHell) to potężne narzędzie do automatyzacji zadań w systemie operacyjnym Unix i jego pochodnych, takich jak Linux. Jest to język skryptowy, który umożliwia tworzenie skryptów do wykonywania różnorodnych operacji, od prostych zadań administracyjnych po bardziej zaawansowane zadania programistyczne.
Cel Kursu: Celem tego kursu jest dostarczenie Ci solidnych podstaw programowania w Bash, abyś mógł efektywnie korzystać z potencjału tego języka skryptowego. Poznasz nie tylko podstawy składni i struktur kontrolnych, ale także praktyczne techniki automatyzacji zadań, przetwarzania tekstu, obsługi plików i wiele więcej.
Zawartość Kursu: Kurs został podzielony na siedem tygodni, z każdym tygodniowym modułem skoncentrowanym na konkretnej tematyce. Rozpoczniemy od wprowadzenia do Bash i podstaw skryptowania, a następnie stopniowo przejdziemy do bardziej zaawansowanych koncepcji, takich jak pętle, funkcje, przetwarzanie tekstu i komunikacja zewnętrznymi programami.
Dla Kogo Jest Ten Kurs: Ten kurs jest dedykowany zarówno początkującym, jak i osobom, które już miały kontakt z systemem Unix/Linux i chcą rozwijać umiejętności programowania w Bash. Jeśli jesteś administratorem systemu, programistą, lub po prostu pasjonatem informatyki, ten kurs zapewni Ci solidną podstawę do efektywnego korzystania z Bash w codziennej pracy.
Jak Korzystać z Kursu: Każdy tydzień kursu obejmuje nową tematykę, a lekcje są podzielone na krótkie, zrozumiałe części. Zachęcamy do praktycznego stosowania zdobytej wiedzy poprzez rozwiązywanie zadań praktycznych i pracę nad projektem końcowym.
Gotowy na fascynującą podróż w świat programowania w Bash? Zacznijmy!
Komentarze są fragmentami tekstu w kodzie programu, które nie są interpretowane jako instrukcje do wykonania przez interpreter, kompilator czy środowisko wykonawcze danego języka programowania. Komentarze służą jedynie do dokumentacji kodu i ułatwiają zrozumienie jego działania. Poniżej przedstawiam kilka kluczowych informacji na temat komentarzy:
Dokumentacja Kodu:
Komentarze są używane do dokumentowania kodu, tłumaczenia jego struktury i funkcji. Dobra dokumentacja pomaga zrozumieć, jak działa kod, co ułatwia zrozumienie i utrzymanie go w przyszłości.
Pomoc dla Innych Programistów:
Komentarze są przydatne dla innych programistów pracujących nad tym samym kodem. Pomagają zrozumieć intencje oryginalnego autora i skrócić czas potrzebny na zaznajomienie się z kodem.
Debugowanie:
Wstawianie komentarzy do kodu może pomóc w identyfikacji i rozwiązaniu problemów podczas procesu debugowania. Programiści często dodają komentarze w miejscach, które są podatne na błędy.
Tymczasowe Wyłączanie Fragmentów Kodu:
Komentarze można również używać do tymczasowego wyłączania fragmentów kodu. Jest to przydatne, gdy chcemy przetestować, czy problem występuje w danym fragmencie, bez konieczności jego całkowitego usuwania.
Komentarze Jednolinijkowe:
Są to komentarze obejmujące tylko jedną linię i zazwyczaj zaczynają się od określonego znacznika, na przykład #
w Bash, Pythonie, czy //
w wielu językach programowania.
# To jest komentarz w Bash
Dobrze używane komentarze mogą znacząco poprawić zrozumienie kodu i ułatwić współpracę w zespole programistycznym.
Zmienne zdefiniowane wewnątrz funkcji są zazwyczaj lokalne i nie są dostępne poza tą funkcją.
funkcja_lokalna() { lokalna_zmienna="To jest zmienna lokalna" echo $lokalna_zmienna } funkcja_lokalna echo $lokalna_zmienna # to spowoduje błąd, bo zmienna jest lokalna
Zmienne zdefiniowane poza funkcją są zazwyczaj globalne i dostępne we wszystkich funkcjach.
Skrypt Bash może przyjmować argumenty, które są przekazywane do skryptu podczas jego wywołania z linii poleceń.
#!/bin/bash echo "Pierwszy argument: $1" echo "Drugi argument: $2"
Wywołanie Skryptu z Argumentami:
./moj_skrypt.sh argument1 argument2
globalna_zmienna="To jest zmienna globalna" funkcja_globalna() { echo $globalna_zmienna } funkcja_globalna
W języku programowania Bash, jak wiele innych skryptowych języków, nie ma surowo zdefiniowanych typów danych. Bash traktuje dane jako ciągi znaków (tekst), co oznacza, że wszystko jest przechowywane jako tekst, nawet liczby. Niemniej jednak, dla celów operacji matematycznych czy porównań, Bash oferuje pewne konwencje i mechanizmy, które można interpretować jako typy danych. Poniżej przedstawiam kilka kluczowych koncepcji związanych z danymi w Bash:
Wszystko w Bash traktowane jest jako tekst, co oznacza, że nawet liczby są przechowywane jako ciągi znaków. Tekst jest zazwyczaj otoczony pojedynczymi lub podwójnymi cudzysłowami.
tekst="To jest tekst."
Warto zaznaczyć, że Bash jest językiem o składni prostszej niż wiele innych, co sprawia, że manipulacja danymi może być bardziej elastyczna, ale jednocześnie wymaga pewnej ostrożności, zwłaszcza jeśli chodzi o konwersje typów w kontekście operacji matematycznych czy porównań.
Bash obsługuje operacje matematyczne, ale liczby są zwykle traktowane jako tekst, z wyjątkiem kontekstów matematycznych.
liczba=42
Bash umożliwia tworzenie tablic, które są zbiorami wartości, indeksowanych liczbowo lub alfanumerycznie.
tablica=("wartość1" "wartość2" "wartość3")
Zmienne logiczne często używane są do warunków logicznych.
prawda=true falsz=false
Wynik wykonania polecenia może być przechowywany w zmiennej.
rezultat=$(ls)
Bash przechowuje informacje o środowisku w zmiennych środowiskowych.
echo $HOME
W Bash możemy definiować funkcje, które przyjmują argumenty i zwracają wartości.
function przywitaj() { echo "Witaj, $1!" } przywitaj "Użytkowniku"
Bash obsługuje operacje na plikach i katalogach, traktując je jako specjalne rodzaje danych.
plik="nazwa_pliku.txt"
W języku Bash możemy przeprowadzać operacje matematyczne, ale jest to dość ograniczone w porównaniu do bardziej zaawansowanych języków programowania. W Bash operacje matematyczne zwykle są wykonywane przy użyciu wbudowanego polecenia (( ))
lub przy użyciu poleceń let
i expr
. Poniżej znajdziesz przykłady najważniejszych operacji matematycznych w Bash:
wynik=$((2 + 3)) echo $wynik # Wypisze: 5
let
:let "wynik = 2 + 3"
wynik=$((5 - 2)) echo $wynik # Wypisze: 3
Użycie let
:
let "wynik = 5 - 2"
wynik=$((4 * 3)) echo $wynik # Wypisze: 12
Użycie let
:
let "wynik = 4 * 3"
wynik=$((10 / 2)) echo $wynik # Wypisze: 5
Użycie let
:
let "wynik = 10 / 2"
Warto zaznaczyć, że w przypadku dzielenia, Bash traktuje wynik jako liczbę całkowitą.
reszta=$((10 % 3)) echo $reszta # Wypisze: 1
Użycie let
:
let "reszta = 10 % 3"
W Bash nie ma bezpośredniego operatora potęgowania, ale można użyć pętli, aby uzyskać wynik potęgowania.
base=2 exponent=3 wynik=1 for ((i = 1; i <= exponent; i++)); do wynik=$((wynik * base)) done echo $wynik # Wypisze: 8
Te operacje matematyczne mogą być używane w różnych kontekstach, takich jak obliczenia w skryptach Bash lub manipulacja liczbami podczas operacji na plikach czy kalkulacjach. Warto jednak pamiętać o tym, że Bash traktuje większość liczb jako ciągi znaków, więc konieczne jest użycie odpowiednich mechanizmów, aby uniknąć błędów wynikających z konwersji typów.
Operacje logiczne w języku Bash są często używane w warunkach decyzyjnych, pętlach i innych konstrukcjach sterujących, aby sprawdzić czy pewne warunki są spełnione. Oto najważniejsze operacje logiczne w Bash:
!
):Negacja jest używana do odwrócenia wartości logicznej. Jeśli warunek jest prawdziwy, to !
sprawi, że stanie się fałszywy, i odwrotnie.
prawda=true falsz=false echo $(!prawda) # Wypisze: false
&&
):Operator koniunkcji (&&
) zwraca true
tylko wtedy, gdy oba warunki są prawdziwe.
warunek1=true warunek2=true if [ $warunek1 ] && [ $warunek2 ]; then echo "Oba warunki są spełnione." fi
||
):Operator alternatywy (||
) zwraca true
, jeśli przynajmniej jeden z warunków jest prawdziwy.
warunek1=true warunek2=false if [ $warunek1 ] || [ $warunek2 ]; then echo "Przynajmniej jeden warunek jest spełniony." fi
==
, !=
, <
, >
, <=
, >=
):Operatory porównania są używane do porównywania wartości zmiennych.
liczba1=5 liczba2=10 if [ $liczba1 -eq $liczba2 ]; then echo "Liczby są równe." fi if [ $liczba1 -lt $liczba2 ]; then echo "Liczba1 jest mniejsza niż Liczba2." fi
-eq
: równy-ne
: różny-lt
: mniejszy niż-le
: mniejszy lub równy-gt
: większy niż-ge
: większy lub równyMożemy grupować warunki przy użyciu nawiasów ( )
w celu zdefiniowania złożonych warunków logicznych.
warunek1=true warunek2=false warunek3=true if [ $warunek1 ] && ( [ $warunek2 ] || [ $warunek3 ] ); then echo "Warunki są spełnione." fi
Operacje logiczne są kluczowe dla sterowania przepływem programu w Bash i są powszechnie stosowane w warunkach, pętlach i instrukcjach warunkowych, aby tworzyć bardziej złożone skrypty i programy.
if
, else
, elif
):Instrukcje warunkowe w języku Bash pozwalają na wykonanie różnych działań w zależności od spełnienia pewnych warunków. Główne instrukcje warunkowe to if
, else
, elif
(skrót od „else if”). Operatorów logicznych używamy w warunkach do porównywania wartości zmiennych i tworzenia wyrażeń logicznych. Oto podstawowe informacje na ten temat:
if
:if
jest podstawową instrukcją warunkową. Jeśli warunek umieszczony po if
jest spełniony (prawdziwy), to blok kodu zagnieżdżony wewnątrz if
jest wykonany.
if warunek; then # kod do wykonania, gdy warunek jest prawdziwy fi
else
:else
umożliwia wykonanie alternatywnego bloku kodu, gdy warunek w instrukcji if
nie jest spełniony.
if warunek; then # kod do wykonania, gdy warunek jest prawdziwy else # kod do wykonania, gdy warunek nie jest prawdziwy fi
elif
:elif
pozwala na sprawdzenie kolejnych warunków, jeśli poprzednie nie zostały spełnione. To jest skrót od „else if”.
if warunek1; then # kod do wykonania, gdy warunek1 jest prawdziwy elif warunek2; then # kod do wykonania, gdy warunek2 jest prawdziwy else # kod do wykonania, gdy żaden z poprzednich warunków nie jest prawdziwy fi
-eq
: Równy: Porównuje, czy dwie wartości są równe.
if [ $liczba1 -eq $liczba2 ]; then # kod do wykonania, gdy liczba1 jest równa liczba2 fi
-ne
: Różny: Sprawdza, czy dwie wartości są różne.
if [ $liczba1 -ne $liczba2 ]; then # kod do wykonania, gdy liczba1 jest różna od liczba2 fi
-lt
, -le
: Mniejszy, Mniejszy lub Równy: Porównuje, czy jedna wartość jest mniejsza (lub mniejsza lub równa) od drugiej.
if [ $liczba1 -lt $liczba2 ]; then # kod do wykonania, gdy liczba1 jest mniejsza od liczba2 fi
-gt
, -ge
: Większy, Większy lub Równy: Porównuje, czy jedna wartość jest większa (lub większa lub równa) od drugiej.
if [ $liczba1 -gt $liczba2 ]; then # kod do wykonania, gdy liczba1 jest większa od liczba2 fi
Operatory logiczne w warunkach:
&&
(i): Warunek jest prawdziwy, gdy oba warunki są spełnione.||
(lub): Warunek jest prawdziwy, gdy przynajmniej jeden z warunków jest spełniony.if [ warunek1 ] && [ warunek2 ]; then # kod do wykonania, gdy oba warunki są spełnione fi if [ warunek1 ] || [ warunek2 ]; then # kod do wykonania, gdy przynajmniej jeden z warunków jest spełniony fi
Kombinując instrukcje if
, else
, elif
i operatory logiczne, możemy tworzyć bardziej złożone struktury sterujące w skryptach Bash, dostosowując działanie programu do różnych sytuacji.
for
, while
, i until
.W języku Bash mamy trzy główne rodzaje pętli: for
, while
, i until
. Pętle umożliwiają wielokrotne wykonanie pewnego bloku kodu w zależności od spełnienia warunku lub iteracji przez zbiór elementów. Poniżej znajdziesz opis każdej z tych pętli oraz przykłady ich użycia:
for
:Pętla for
używana jest do iteracji przez zbiór elementów, takich jak tablica, lista plików, czy sekwencja liczbowego.
for zmienna in element1 element2 element3; do # kod do wykonania w każdej iteracji echo $zmienna done
Przykład z iteracją przez listę plików:
for plik in *.txt; do echo "Przetwarzam plik: $plik" done
while
:Pętla while
wykonuje blok kodu tak długo, jak długo warunek jest prawdziwy.
while warunek; do # kod do wykonania, dopóki warunek jest prawdziwy # pamiętaj o aktualizacji warunku wewnątrz pętli, aby uniknąć nieskończonej pętli done
Przykład z licznikiem w pętli while
:
licznik=0 while [ $licznik -lt 5 ]; do echo "Iteracja: $licznik" licznik=$((licznik + 1)) done
until
:Pętla until
jest podobna do while
, ale wykonuje blok kodu, dopóki warunek nie jest prawdziwy.
until warunek; do # kod do wykonania, dopóki warunek jest fałszywy # pamiętaj o aktualizacji warunku wewnątrz pętli, aby uniknąć nieskończonej pętli done
Przykład z licznikiem w pętli until
:
licznik=0 until [ $licznik -ge 5 ]; do echo "Iteracja: $licznik" licznik=$((licznik + 1)) done
Przetwarzanie plików jest jednym z częstych zastosowań pętli w Bash. Przykład z użyciem pętli for
do przeglądania plików w danym katalogu:
for plik in *; do if [ -f $plik ]; then echo "Przetwarzam plik: $plik" # dodaj tutaj operacje, które chcesz wykonać na każdym pliku fi done
W tym przykładzie pętla for
przechodzi przez każdy plik w bieżącym katalogu, a następnie wykonuje określone operacje tylko na plikach (ignorując katalogi). Pętle while
i until
mogą być również używane do przetwarzania plików, zwłaszcza gdy warunki związane z przetwarzaniem są bardziej skomplikowane.
W Bash funkcje są używane do zorganizowania kodu na bardziej modułowe fragmenty. Funkcje pozwalają na wielokrotne wykorzystanie określonego bloku kodu. Oto ogólna składnia tworzenia i wywoływania funkcji:
Tworzenie Funkcji:
nazwa_funkcji() { # kod funkcji echo "Witaj, jestem funkcją!" }
Wywoływanie Funkcji:
nazwa_funkcji # wywołanie funkcji
Funkcje w Bash mogą przyjmować parametry, co pozwala na przekazywanie im różnych danych.
Przykład Funkcji z Parametrami:
wyswietl_powitanie() { echo "Witaj, $1!" } wyswietl_powitanie "Użytkowniku"
Warto zaznaczyć, że przekazywanie parametrów do funkcji i zarządzanie zmiennymi lokalnymi i globalnymi są ważnymi aspektami programowania w Bash, szczególnie w przypadku większych projektów, gdzie modularność i czytelność kodu są kluczowe.
grep
(Global Regular Expression Print):grep
służy do przeszukiwania plików w poszukiwaniu wzorców i wypisywania linii zawierających pasujące do tych wzorców fragmenty tekstu.
Przykład:
grep "pattern" plik.txt
sed
(Stream Editor):sed
to potężne narzędzie do przetwarzania i edycji tekstu w strumieniach.
Przykład:
sed 's/old_pattern/new_pattern/g' plik.txt
awk
:awk
to język programowania używany głównie do przetwarzania i analizy tekstu. Jest potężnym narzędziem do filtrowania, przetwarzania i analizy danych w plikach tekstowych.
Przykład:
awk '/pattern/ {print $1, $2}' plik.txt
<code>cp plik.txt nowy_plik.txt</code>
<code>mv plik.txt katalog_docelowy/</code>
<code>rm plik.txt</code>
<code>ls</code>
<code>mkdir nowy_katalog</code>
<code>rmdir katalog_do_usuniecia</code>
Te polecenia to tylko podstawowe operacje na tekście, plikach i katalogach w Bash. Mogą być one wykorzystywane w bardziej złożonych skryptach do automatyzacji różnych zadań, takich jak przeszukiwanie, analiza, czy manipulacja danymi tekstowymi czy plikami.
Do parsowania plików JSON w Bash możemy użyć polecenia jq
. Jeśli nie jest zainstalowane, możemy je zainstalować przy użyciu menedżera pakietów dla danego systemu operacyjnego.
# Instalacja jq sudo apt-get install jq # dla systemów opartych na Debianie, takich jak Ubuntu
Przykład parsowania pliku JSON:
json_data='{"name": "John", "age": 30, "city": "New York"}' name=$(echo $json_data | jq -r '.name') age=$(echo $json_data | jq -r '.age') echo "Name: $name" echo "Age: $age"
Możemy użyć poleceń echo
i jq
do generowania plików JSON.
<code>echo '{"name": "Alice", "age": 25, "city": "San Francisco"}' > plik.json</code>
Do obsługi plików CSV w Bash często używane są polecenia takie jak awk
czy cut
. Oto kilka przykładów:
1. Wybieranie Kolumn z Pliku CSV:
# Wybieranie drugiej kolumny z pliku CSV awk -F ',' '{print $2}' plik.csv
# Filtracja wierszy, w których trzecia kolumna zawiera wartość "Warsaw" awk -F ',' '$3 == "Warsaw" {print}' plik.csv
# Sumowanie wartości w trzeciej kolumnie awk -F ',' '{sum+=$3} END {print sum}' plik.csv
# Zamiana wartości "OldValue" na "NewValue" w drugiej kolumnie awk -F ',' '{gsub(/OldValue/, "NewValue", $2)} {print}' plik.csv
Te przykłady przedstawiają podstawowe operacje na plikach JSON i CSV w Bash. Jeśli potrzebujesz bardziej zaawansowanej obsługi, warto rozważyć użycie narzędzi stworzonych specjalnie do przetwarzania danych w tych formatach.
Napisz skrypt Bash, który będzie analizować plik CSV zawierający dane o użytkownikach. Plik powinien zawierać kolumny takie jak „Imię”, „Nazwisko”, „Wiek”, „Miasto”. Skrypt powinien wykonać następujące operacje:
Napisz skrypt Bash, który automatyzuje kilka zadań systemowych. Skrypt powinien:
df
do sprawdzenia, ile miejsca zajmują poszczególne partycje dyskowe.apt-get
do aktualizacji systemu.Napisz program w Bash, który przekształca dane w jednym formacie do drugiego. Na przykład, skrypt może obsługiwać konwersję pliku CSV na plik JSON lub odwrotnie. Program powinien być elastyczny i obsługiwać różne rodzaje danych.
Napisz skrypt monitorujący zasoby systemowe, takie jak CPU, pamięć RAM, i obciążenie systemu. Skrypt powinien:
top
lub ps
do uzyskania informacji o obciążeniu CPU przez różne procesy.