Użytkowanie komputerów i podstawy systemów operacyjnych - laboratorium 04
Post

Użytkowanie komputerów i podstawy systemów operacyjnych - laboratorium 04


Skrypty Bash

Skrypty Bash pozwalają na wykonanie serii poleceń terminala bez konieczności ich ręcznego wprowadzania. Podstawowa zasada jest taka: wszystko, co możemy uruchomić z terminala, możemy również wykonać przy użyciu skryptu. Działa to również w drugą stronę: wszystko, co możemy zrobić w skrypcie, można również wykonać w terminalu.

Konfiguracja

Zazwyczaj nie ma potrzeby specjalnej konfiguracji. Jednak pierwsza linia skryptu powinna wskazywać systemowi, którego interpretera użyć. Choć większość powłok domyślnie zakłada użycie własnego interpretera, warto to zawsze sprecyzować.

Aby sprawdzić lokalizację interpretera Bash, używamy polecenia:

1
which bash

Najczęściej odpowiedzią będzie /bin/bash.

W pierwszej linii skryptu wskazujemy interpreter w następujący sposób:

1
#!/bin/bash

Tworzenie pierwszego skryptu

Utwórz pusty plik o dowolnej nazwie. Pamiętaj, że w systemie Linux pliki nie muszą mieć rozszerzeń, aby działały poprawnie. Jednak dla czytelności i łatwiejszego rozpoznawania skryptów Bash zazwyczaj nadaje się im rozszerzenie .sh.

Przykładowo, możemy użyć edytora tekstu geany do utworzenia skryptu:

1
geany skrypt1.sh &

Dodanie znaku & po poleceniu powoduje uruchomienie programu w tle, dzięki czemu terminal pozostaje dostępny.

Przykład prostego skryptu (skrypt1.sh):

1
2
3
#!/bin/bash
echo "Wypisanie wszystkich plików z katalogu:"
ls

Ten skrypt najpierw wyświetli komunikat za pomocą polecenia echo, a następnie wypisze listę plików w bieżącym katalogu za pomocą polecenia ls.

Aby uruchomić skrypt, nadajemy mu uprawnienia wykonania:

1
chmod 755 skrypt1.sh

Następnie uruchamiamy go poleceniem:

1
./skrypt1.sh

Zmienne

W Bashu zmienne działają podobnie jak w innych językach programowania, z tą różnicą, że nie musimy deklarować ich typu. Przypisanie wartości do zmiennej odbywa się następująco:

1
zmienna='wartość'

Uwaga: Nie należy umieszczać spacji przed ani po znaku =. Linia z niepoprawnym formatowaniem, np.:

1
zmienna = wartość

zostanie potraktowana jako próba wykonania polecenia zmienna z argumentami = i wartość, co spowoduje błąd.

Aby odwołać się do wartości zmiennej w skrypcie, poprzedzamy jej nazwę znakiem dolara:

1
echo $zmienna

Przykład:

1
2
3
#!/bin/bash
tekst='To jest przykładowy tekst.'
echo $tekst

Operacje arytmetyczne

Bash pozwala na wykonywanie operacji matematycznych na liczbach całkowitych. Wynik działania arytmetycznego możemy przypisać do zmiennej na kilka sposobów:

  1. Używając $(( )):

    1
    
    wynik=$(($zmienna1 + $zmienna2))
    
  2. Używając polecenia let:

    1
    
    let a=1+8
    
  3. Używając polecenia expr:

    1
    
    expr 5 + 2
    

    Uwaga: expr wyświetla wynik na terminalu, zamiast przypisywać go do zmiennej.

Przykładowy skrypt wykonujący operacje arytmetyczne

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/bin/bash
# Skrypt wykonujący podstawowe operacje arytmetyczne

liczba1=10
liczba2=5

# Dodawanie
suma=$(($liczba1 + $liczba2))
# Odejmowanie
roznica=$(($liczba1 - $liczba2))
# Mnożenie
iloczyn=$(($liczba1 * $liczba2))
# Dzielenie
if [ $liczba2 -ne 0 ]; then
    iloraz=$(($liczba1 / $liczba2))
else
    iloraz="Nie można dzielić przez zero"
fi

echo "Liczba 1: $liczba1"
echo "Liczba 2: $liczba2"
echo "Suma: $suma"
echo "Różnica: $roznica"
echo "Iloczyn: $iloczyn"
echo "Iloraz: $iloraz"

Opis skryptu:

  • Definiujemy dwie zmienne liczba1 i liczba2.
  • Wykonujemy podstawowe operacje arytmetyczne: dodawanie, odejmowanie, mnożenie i dzielenie.
  • Przy dzieleniu sprawdzamy, czy liczba2 nie jest zerem, aby uniknąć dzielenia przez zero.
  • Wyświetlamy wyniki operacji za pomocą polecenia echo.

Uruchomienie skryptu:

  1. Zapisz skrypt w pliku operacje.sh.
  2. Nadaj uprawnienia wykonania:

    1
    
    chmod 755 operacje.sh
    
  3. Uruchom skrypt:

    1
    
    ./operacje.sh
    

Przykładowy wynik:

1
2
3
4
5
6
Liczba 1: 10
Liczba 2: 5
Suma: 15
Różnica: 5
Iloczyn: 50
Iloraz: 2

Przypisywanie wyniku polecenia do zmiennej

Możemy przypisać do zmiennej wynik dowolnego polecenia. W tym celu używamy odwrotnych apostrofów (backticks) ` lub składni $( ). Zaleca się używanie tej drugiej metody ze względu na lepszą czytelność i możliwość zagnieżdżania.

Przykład z backticks:

1
2
data=`date`
echo "Aktualna data i czas: $data"

Przykład z $( ):

1
2
data=$(date)
echo "Aktualna data i czas: $data"

Argumenty w skryptach

Po uruchomieniu skryptu pewne zmienne są automatycznie ustawiane:

  • $0 — nazwa skryptu
  • $1$9 — argumenty przekazane do skryptu
  • $# — liczba argumentów

Przykład prostego dodawania z użyciem argumentów:

1
2
3
4
5
6
7
#!/bin/bash
if [ $# -eq 2 ]; then
    suma=$(($1 + $2))
    echo "Suma: $suma"
else
    echo "Podaj dokładnie dwie liczby jako argumenty."
fi

Uruchomienie skryptu z dwoma argumentami:

1
./skrypt.sh 5 3

Wynik:

1
Suma: 8

Instrukcja warunkowa if

Instrukcja if w Bashu ma następującą składnię:

1
2
3
4
if [ warunek ]
then
    polecenia
fi

Porównania liczbowe

Operatory do porównań liczbowych:

  • -eq — równe (==)
  • -ne — różne (!=)
  • -gt — większe niż (>)
  • -lt — mniejsze niż (<)
  • -ge — większe lub równe (>=)
  • -le — mniejsze lub równe (<=)

Przykład:

1
2
3
4
if [ $zmienna1 -gt $zmienna2 ]
then
    echo "zmienna1 jest większa od zmiennej2"
fi

Porównania tekstowe

Operatory do porównań ciągów znaków:

  • = — równe
  • != — różne

Przykład:

1
2
3
4
if [ "$tekst1" = "$tekst2" ]
then
    echo "Teksty są identyczne"
fi

Uwaga: Przy porównywaniu ciągów znaków zaleca się używanie cudzysłowów, aby uniknąć błędów związanych z białymi znakami czy pustymi wartościami.

Operatory logiczne

Operatory logiczne:

  • && — logiczne AND
  • || — logiczne OR

Przykład złożonego warunku:

1
2
3
4
if [ $zmienna1 -eq $zmienna2 ] && [ $zmienna2 -lt $zmienna3 ]
then
    echo "Warunek spełniony"
fi

Konstrukcje else i elif

Instrukcja if może być rozszerzona o bloki else i elif:

1
2
3
4
5
6
7
8
9
if [ warunek1 ]
then
    polecenia1
elif [ warunek2 ]
then
    polecenia2
else
    polecenia3
fi

Zadania

  1. Wyświetlanie komunikatu w zależności od obecności argumentów:

    Napisz skrypt, który wyświetla jeden komunikat, jeśli przekazano do niego jakiekolwiek argumenty, a inny komunikat, jeśli nie przekazano żadnych argumentów.

  2. Wypisanie zawartości katalogu i liczby plików:

    Napisz skrypt, który wypisze zawartość katalogu Downloads, a następnie poda, ile znajduje się w nim plików.

  3. Porównanie trzech parametrów:

    Napisz skrypt, który porówna trzy przekazane parametry i wyświetli największy z nich. Jeśli zostanie podana inna liczba parametrów niż trzy, skrypt powinien wyświetlić komunikat o błędzie.

  4. Filtracja danych z pliku:

    Do zadania uzyj pliku komputery.txt z poprzednich zajec. Napisz skrypt, który jako argumenty przyjmuje trzy litery sektorów oraz pewna liczbę x. Skrypt powinien wypisać pierwszych x komputerów z tych sektorów.

  5. Zapisywanie wyniku polecenia top do pliku:

    Napisz skrypt, który zapisze wynik polecenia top do pliku o nazwie log[data_utworzenia], gdzie [data_utworzenia] to aktualna data i godzina utworzenia pliku.