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