Skrypty bash, część 1

Przypomnienia ogólne

Każdy skrypt powinien rozpoczynać się linią

#!/bin/bash

i posiadać uprawnienia do wykonywania.

Skrypty można wywołać:

$ ./skrypt.sh  # skrypt.sh jest w bieżącym katalogu
$ katalog/skrypt.sh # ... w innym katalogu

Informacje o składni można znaleźć w:

Zmiana pierwszej linii na:

#!/bin/bash -x

spowoduje, ze bash wyświetli każde wykonywane polecenie. Przydatne przy szukaniu błędów.

W trakcie tych zajęć należy używać edytora vim.

Przypomnienia – argumenty wywołania

Zmienne specjalne:

Zmienna Znaczenie
$* Wszystkie parametry wywołania
$@ Wszystkie parametry wywołania
$# Liczba parametrów wywołania
$1, $2, … n-ty parametr wywołania

Uwaga: Działanie $* i $@ różni się w zakresie interpretowania spacji w parametrach.

Przykłady – parametry

Przykład użycia parametrów wywołania: arguments1.sh.

Zadania – parametry wywołania

  1. Hello world

    Napisać skrypt, który wypisze tekst Hello world na stdout

  2. Zamiana plików

    Napisać skrypt, który zamieni zawartościami dwa pliki podane jako argumenty. Zadbać aby nazwy plików ze spacjami były poprawnie obsłużone.

    Użyteczne programy: mktemp, mv, rm

    Podpowiedź: zamiana wartościami dwóch zmiennych w C wymaga pomocniczej zmiennej:

  3. Liczenie słów

    Napisać skrypt, który można wywołać z dowolną liczbą parametrów. Skrypt wypisuje liczbę wszystkich słów (nie tylko słów linux), we wszystkich liniach zawierających słowo linux, we wszystkich plikach podanych jako argumenty. (Czyli wypisujemy jedną liczbę jako wyjście).

    Programy: grep, wc, przypomnienie: grep można wywołać z dowolną liczbą plików jako argumenty. Warto użyć operatora |

Przykłady – konstrukcja warunkowa

Przykład: conditional.sh

Zadania – konstrukcja warunkowa

  1. Przynależność do grup

    Napisać, skrypt, który przyjmuje dwa argumenty: nazwę użytkownika i nazwę grupy. Skrypt sprawdza czy podany użytkownik jest członkiem podanej grupy. W przypadku, gdy jest: wypisuje komunikat z informacją i kończy się ze statusem 0, w p.p. wypisuje informację i kończy się ze statusem 1.

    Podpowiedzi: id -n -G, grep -E, wyrażenie regularne z , echo, przekierowanie do /dev/null, exit 0, exit 1

    Uwaga: użytkownik karwowskij jest członkiem grupy teachers, ale nie tea. Należy to poprawnie obsłużyć!

  2. Długie pliki

    Napisać skrypt, który sprawdza czy plik podany jako argumenty jest długi i jeśli tak jest, wypisuje komunikat “To jest długi plik”. Za długi plik uznawać plik o długości większej niż 200 linii.

    Podpowiedzi: wc, test

  3. Gra w zgadywanie liczb

    Napisać skrypt, który losuje liczbę i prosi użytkownika, aby ją odgadł wpisując ją z klawiatury. Jeśli użytkownik odgagł liczbę, zakończyć skrypt ze statusem 0, w p.p. 1.

    Podpowiedzi: bash definiuje specjalną zmienną $RANDOM, która przy każdym podstawieniu zwraca inną liczę losową. Aby odczytać tekst z klawiatury i zapisać go do zmiennej należy użyć polecenia read powłoki (znaleźć szczegóły użycia w manualu).

  4. Dłuższy plik

    Napisać skrypt, który dla dwóch nazw plików podanych jako argumenty wypisze na stdout ten, który ma więcej linii.

  5. Ulepszona zamiana plików

    Rozszerzyć skrypt zamieniający zawartości plików o następujące elementy:

    • sprawdzenie czy podano dokładnie 2 argumenty wywołania
    • sprawdzenie czy oba argumenty są zwykłymi plikami

    Jeśli warunki nie są spełnione wypisać komunikat o błędzie i zakończyć ze statusem 1.

  6. Prosta kopia zapasowa

    Napisać skrypt, który przyjmuje dokładnie jeden plik jako argument. Skrypt tworzy w katalogu HOME/backup kopię pliku o takiej samej nazwie. Ponadto w katalogu HOME/backup tworzony jest plik o tej samej nazwie z dodanym rozszerzeniem .description. Plik ten ma zawierać numer i-node oryginalnego pliku.

    Jeśli katalog backup nie istnieje, ma zostać utworzony.

    stat, basename

  7. Dziennik (trudne)

    Napisać skrypt, który umożliwi następujące operacje:

    • dodanie wpisu do dziennika
    • wypisanie plików z danego dnia

    Każdy wpis w dzienniku składa się z dokładnie jednej linii. Wpisy mają być przechowane w pliku tekstowym w postaci

    [data] wpis

    Szczegóły implementacji – sposób wywołania skrypty, format daty, itp. należy wybrać samodzielnie (najlepiej tak, aby ułatwić sobie implementację).

    Podpowiedzi: grep -E, date