Linux | Terminal - skrypty bash - wprowadzenie · Technik informatyk egzamin zawodowy

Soisk / Linux

Linux | Terminal - 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...