
Linux: Wiersz poleceń – skrypty bash – wprowadzenie
Wprowadzenia słów kilka do skryptów powłoki. Zmienne, wypisywanie na ekran, wprowadzanie z klawiatury, parametry, funkcje, instrukcja warunkowa if.
Zwyczajowo pliki skryptów bash oznaczamy “rozszerzeniem” .sh, natomiast jako pierwszą linię wprowadzamy #!/bin/bash.
# rozpoczyna komentarz – informacyjny fragment linii, bez znaczenia dla działania programu.
Czas na pierwszy skrypt:
student@student:~/Pulpit$ cat > skrypt1.sh #!/bin/bash echo "No cześć"
Skrypt już mamy. Po jego niezwykle skomplikowanej treści możemy się domyśleć co zrobi, jednak najpierw ustawmy jeszcze dla wszystkich użytkowników prawo jego wykonywania.
student@student:~/Pulpit$ ls -l -rw-rw-r-- 1 student student 30 mar 20 16:41 skrypt1.sh student@student:~/Pulpit$ chmod +x skrypt1.sh student@student:~/Pulpit$ ls -l -rwxrwxr-x 1 student student 30 mar 20 16:41 skrypt1.sh
Czas zobaczyć nasze dzieło w działaniu:
student@student:~/Pulpit$ bash skrypt1.sh No cześć
read – wczytanie informacji ze standardowego wejścia, klawiatury od użytkownika
Wykorzystajmy tą wiedzę i napiszmy skrypt, który zapyta użytkownika o imię, następnie wypisze je na ekran:
#!/bin/bash echo "Podaj swoje imię:" read imie echo Podane imię to:$imie
Efekt działania:
student@student:~/Pulpit$ bash imie.sh Podaj swoje imię: TechnikInformatyk.pl Podane imię to:TechnikInformatyk.pl
Każde wykonywana funkcja zwraca kod, kod sukcesu bądź błędu. W przypadku pozytywnego wykonania kodem standardowo jest 0.
Sprawdźmy jakie kody zostaną zwrócone w poniższym przykładzie:
student@student:~/Pulpit$ ls /etc/passwd /etc/passwd student@student:~/Pulpit$ echo $? 0 student@student:~/Pulpit$ ls /etc/passwdabc ls: nie ma dostępu do '/etc/passwdabc': Nie ma takiego pliku ani katalogu student@student:~/Pulpit$ echo $? 2
Umieszczenie wielu poleceń w jednej linii. Przeanalizujmy jakie różnice nastąpią przy łączeniu poleceń za pomocą symboli: ; && oraz ||.
student@student:~/Pulpit$ dir plik2 plik3 student@student:~/Pulpit$ cat plik1 ; cat plik2 ; cat plik3 cat: plik1: Nie ma takiego pliku ani katalogu zawartość pliku 2 zawartość pliku 3 student@student:~/Pulpit$ cat plik1 && cat plik2 && cat plik3 cat: plik1: Nie ma takiego pliku ani katalogu student@student:~/Pulpit$ cat plik1 || cat plik2 || cat plik3 cat: plik1: Nie ma takiego pliku ani katalogu zawartość pliku 2
W przypadku “i”, logicznej koniunkcji, czyli symbolu podwójnego & jeśli dane polecenie będzie wykonane z błędem, kolejne nie będą wykonywane.
Logiczna alternatywa, || słownie lub, przechodzi przez kolejne polecenia, aż wykonanie któregoś nie zakończy się kodem 0.
Symbol ; jedynie rozdziela kolejne polecenia. Wszystkie one zostaną wykonane.
Wewnątrz skryptu możemy odwołać się do parametrów. Parametrem zerowym jest nazwa skryptu, kolejne możemy podać podczas uruchamiania skryptu.
Parametr | Znaczenie |
$0 | Nazwa skryptu |
$1 | Pierwszy parametr |
$2, $3, etc. | Drugi parametr, trzeci parametr, … |
$* | Wszystkie parametry |
$# | Liczba argumentów |
Przykładowa zawartość skryptu odczytującego parametry wejściowe:
#!/bin/bash echo "Nazwa skryptu: "$0 echo "Pierwszy parametr: "$1 echo "Drugi parametr: "$2 echo "Wszystkie parametry: "$*
Oraz efekt jego działania:
student@student:~/Pulpit$ bash parametry.sh 20 TI Nazwa skryptu: parametry.sh Pierwszy parametr: 20 Drugi parametr: TI Wszystkie parametry: 20 TI
Jeśli dany fragment kodu skryptu planujemy wykonywać wielokrotnie, warto zamknąć go w strukturę funkcji – elementu do którego odwołujemy się podając jej nazwę.
Przykład zastosowania funkcji:
#!/bin/bash ulubiony(){ echo Mój ulubiony przedmiot to: $1 } echo "" ulubiony "Język Polski" ulubiony Matematyka ulubiony WF ulubiony Biologia
Efekt działania:
student@student:~/Pulpit$ bash funkcje.sh Mój ulubiony przedmiot to: Język Polski Mój ulubiony przedmiot to: Matematyka Mój ulubiony przedmiot to: WF Mój ulubiony przedmiot to: Biologia
Ostatnim elementem tego przydługiego tematu będzie instrukcja warunkowa. Pytanie jeżeli, zapytanie o spełnienie warunku oraz wykonanie pewnych czynności w przypadku gdy ten warunek będzie spełniony oraz innych gdy spełniony nie będzie.
Wersja kompaktowa:
if WARUNKI; then INSTRUKCJE; fi
Wersja standardowa:
if condition then statements else statements fi
Przykładowy skrypt, który sprawdza czy istnieje ścieżka /etc/passwd.
#!/bin/bash if [ -f /etc/passwd ] then echo "/etc/passwd istnieje." fi
Efekt działania:
student@student:~/Pulpit$ bash jezeli.sh /etc/passwd istnieje.
Skrypt przeanalizował strukturę katalogową systemu Linux i stwierdził, że ścieżka /etc/passwd istnieje.
W powyższym programie wykorzystaliśmy parametr -f sprawdzający czy plik istnieje i jest plikiem 🙂
Poniżej tabela wszystkich możliwych opcji dotyczących pliku.
Parametr | Znaczenie |
-e plik | Sprawdzenie czy plik istnieje. |
-d plik | Sprawdzenie czy plik jest katalogiem. |
-f plik | Sprawdzenie czy plik jest plikiem (a nie np. dowiązaniem symbolicznym). |
-s plik | Sprawdzenie czy rozmiar pliku jest większy od 0. |
-u plik | Sprawdzenie czy plik ma ustawioną flagę suid – w przypadku SUID ustawionego na pliku wykonywalnym powoduje wykonanie pliku z UID ustawionym na właściciela pliku (jeżeli właścicielem pliku jest root, to uruchomienie takiego pliku z dowolnego konta spowoduje wykonanie tego pliku z poziomem uprawnień roota). |
-g plik | Sprawdzenie czy plik ma ustawioną flagę sgid. |
-r plik | Sprawdzenie czy plik jest odczytywalny. |
-w plik | Sprawdzenie czy plik jest zapisywalny. |
-x plik | Sprawdzenie czy plik jest wykonywalny. |
Napiszmy zatem kolejny skrypt. Tym razem sprawdzamy czy plik o nazwie plik1 istnieje. Jeśli istnieje wypisujemy taką właśnie informację na ekran, jeśli nie istnieje – skrypt go utworzy.
#!/bin/bash if [ -f plik1 ] then echo Plik1 już istnieje else echo Utworzony > plik1 echo Plik1 został utworzony fi
Efekt dwukrotnego uruchomienia skryptu w katalogu, gdzie plik plik1 nie istniał.
student@student:~/Pulpit$ bash jezeli2.sh Plik1 został utworzony student@student:~/Pulpit$ bash jezeli2.sh Plik1 już istnieje
Sprawdzaliśmy za pomocą instrukcji warunkowej jeżeli czy plik istniał, zabierzmy się na chwilę za sprawdzenie wartości liczbowych.
Możliwe operacje na liczbach:
Operator | Znaczenie |
-eq | Równe |
-ne | Nierówne |
-gt | Większe niż |
-lt | Mniejsze niż |
-ge | Większe lub równe |
-le | Mniejsze lub równe |
Przykładowy skrypt
#!/bin/bash WIEK=$1 if [[ $WIEK -ge 0 ]] && [[ $WIEK -lt 11 ]]; then echo "Jesteś dzieckiem..." elif [[ $WIEK -ge 11 ]] && [[ $WIEK -lt 20 ]]; then echo "Jesteś nastolatkiem..." elif [[ $WIEK -ge 20 ]] && [[ $WIEK -lt 30 ]]; then echo "Jesteś dzieścia..." elif [[ $WIEK -ge 30 ]] && [[ $WIEK -lt 50 ]]; then echo "Jesteś dzieści..." elif [[ $WIEK -ge 50 ]] && [[ $WIEK -lt 100 ]]; then echo "Jesteś dziesiąt..." elif [[ $WIEK -ge 100 ]] && [[ $WIEK -lt 130 ]]; then echo "Gratulacje..." else echo "Podano nieprawidłowe dane wejściowe" fi
oraz efekt jego zastosowania dla różnych wartości liczbowych podanych jako parametr wejściowy nr 1.
student@student:~/Pulpit$ bash wiek.sh 5 Jesteś dzieckiem... student@student:~/Pulpit$ bash wiek.sh 15 Jesteś nastolatkiem... student@student:~/Pulpit$ bash wiek.sh 35 Jesteś dzieści... student@student:~/Pulpit$ bash wiek.sh 75 Jesteś dziesiąt... student@student:~/Pulpit$ bash wiek.sh 105 Gratulacje...
Tyle na teraz. Dzięki, że dotrwaliście 🙂 Czas na ćwiczenia… ćwiczenia… ćwiczenia…