Linuks skrypty Część teoretyczna Zmienne środowiskowe Interpreter poleceń nazywany inaczej także powłoką systemową pośredniczy pomiędzy użytkownikiem a funkcjami systemu operacyjnego. Powłoka systemowa pobiera dane i polecenia od użytkownika i przekazuje je do wykonania do jądra systemu operacyjnego. Dostępnych jest wiele różnych powłok, z których najpopularniejsze wydają się następujące: interpreter Korna uruchamiany poleceniem ksh, interpreter tcsh oraz najpopularniejszy i najpowszechniej obecnie stosowany bash (ang. Bourne Again Shell). Zmienne środowiskowe to bardzo wygodny i uniwersalny sposób konfigurowania i parametryzowania powłok systemowych i za ich pomocą także innych programów. Dostępne zmienne środowiskowe tworzą tzw. środowisko wykonania procesu środowisko to jest kopiowane do wszystkich nowych procesów, a więc modyfikacje zmiennych wykonane w powłoce są widoczne we wszystkich programach uruchomionych przy użyciu tej powłoki. Polecenie systemowe set pozwala wyświetlić wartości wszystkich zmiennych środowiskowych, a polecenie unset usuwa zmienną środowiskową, oto przykład: unset SYSTEM Jak wspomniano środowisko wykonania procesu jest przekazywane do procesów potomnych jednak nie wszystkie zmienne powłoki muszą być przekazywane do uruchamianych programów. Zmienne, które są przekazywane nazywa się zmiennymi eksportowanymi, a zmienne, które nie są przekazywane, nazywa się zmiennymi lokalnymi. Z reguły nowo tworzone zmienne są początkowo zmiennymi lokalnymi i niezbędne jest jawne wskazanie, że mają być zmiennymi eksportowanymi. Nazywa się to eksportowaniem zmiennych i jest realizowane przez poleceniem: export lista_zmiennych Każdy użytkownik może łatwo (np. poleceniem set) zweryfikować, że w systemie jest zdefiniowanych wiele zmiennych środowiskowych, oto znaczenie podstawowych z nich: HOME ścieżka i nazwa katalogu domowego użytkownika; USER nazwa zalogowanego użytkownika; PATH ścieżki poszukiwań programów; PS1 postać znaku zachęty użytkownika; SHELL pełna ścieżka do domyślnego interpretatora poleceń użytkownika Praca ze skryptami Skrypty powłoki to pliki tekstowe, które zawierają ciągi poleceń dla powłoki systemowej. Współczesne powłoki pozwalają także aby skryty zawierały konstrukcje programistyczne, takie jak instrukcje warunkowe czy pętle, polecenia pozwalające na interaktywną prace skryptu, czy też przekazywanie argumentów ich wywołania. Skryty są bardzo pomocnym rozwiązaniem kiedy istnieje konieczność wykonywania złożonych poleceń i poleceń, które są powtarzane okresowo. Skrypty mogą być parametryzowane argumentami ich wywołania oznacza to, że podczas uruchamiania skryptu można przekazać do niego dowolną ilość dowolnych danych. Do argumentów wywołania można się odwoływać w skryptach za pomocą tzw. zmiennych pozycyjnych, oznaczanych: 1,2,3...9. Każda zmienna pozycyjna przechowuje tekst przekazany za pośrednictwem odpowiadającemu jej argumentu wywołania pierwszy argument dostępny jest w zmiennej pozycyjnej 1 itd.
Do stworzenia skryptu używamy dowolnego edytora tekstu lub tworzymy pusty plik: touch nazwa_skryptu a następnie nadajemy mu prawa do wykonania: chmod 755 nazwa_skryptu Otwieramy skrypt edytorem i wpisujemy komendy powłoki systemowej, które chcemy wykonać jedna po drugiej. Wpisz następującą zawartość: Oto przykład skryptu, który wyświetla wartości pierwszych trzech argumentów jego wywołania: - decyduje, który interpreter poleceń wykona dany skrypt (może być python, perl, node js, i inne) # pierwszy skrypt - komentarz echo argument nr 1: $1 echo argument nr 2: $2 echo argument nr 3: $3 Wywołanie z parametrami./skrypt jeden "dwa i pół" trzy Przykład 2: echo 'To jest tekst' echo "A to drugi" zmienna="cześć" echo "Wartość zmiennej to: $zmienna" echo 'Pojedynczy cudzysłów i $zmienna' echo "Umieszczenie zmiennej wewnątrz tekstu: " echo "część-stała{$zmienna}cośzazmienną, lub " echo "tylko sufiks, ${zmienna}i-coś-za-zmienną" uzytkownik= Zosia echo "Ścieżka to: /home/{$uzytkownik}/pliki " Następnie wykonaj plik wpisując w konsoli./plik (w konsoli przechodzimy do katalogu gdzie jest plik lub wpisujemy sciezke). Zobaczysz coś takiego: To jest tekst A to drugi Wartość zmiennej to: cześć Pojedynczy cudzysłów i $zmienna Polecenie echo wyświetla tekst, jeżeli jest on w podwójnym cudzysłowie - będzie parsowany przez powłokę (zmienne zostaną zamienione na ich wartości) jeżeli pojedyncze - tekst nie będzie parsowany przez powłokę. Zmienną deklarujemy: zmienna = "wartość"
Zmienną można też wyświetlić bezpośrednio: echo $zmienna Interakcja z użytkownikiem: read zmienna polecenie które czeka na wpisaną przez użytkownika wartość i wczytuję ją do zmienna. Przykład: echo -e "Hi, please type the word: \c " read word echo "The word you entered is: $word" Operacje arytmetyczne: Polecenie let jest poleceniem używanym w celu wykonywania operacji na wartościach arytmetycznych. Używając go można porównywać dwie wartości i wykonywać działania takie jak dodawanie, odejmowanie czy mnożenie. Tego typu operacje matematyczne są często używane w programach w celu zarządzania strukturami kontrolnymi lub wykonywaniem koniecznych obliczeń. Polecenie let może być oznaczone przy użyciu słowa kluczowego let lub podwójnego nawiasu. Typowy sposób wykorzystania polecenia składa się ze słowa let po którym następują dwie wartości numeryczne, oddzielone operatorem arytmetycznym lub relacyjnym w poniższy sposób: $ let 5 + 7 To samo można zapisać przy pomocy podwójnego nawiasu: $ ((5 + 7)) Polecenie let automatycznie zakłada, że operatory są arytmetyczne lub relacyjne. Nie trzeba więc umieszczać w cudzysłowie operatorów powłoki. Polecenie to również automatycznie oblicza wartość zmiennych i przekształca ją na wartość arytmetyczną. Oznacza to, że można wpisywać operacje arytmetyczne jako proste wyrażenia matematyczne. W następnym przykładzie polecenie let mnoży 4 przez 8. Wynik przesłany jest do standardowego wyjścia i zostaje wyświetlony na ekranie. $ let 4*8 36 Jeżeli zostawia się odstępy pomiędzy elementami wyrażenia, trzeba umieścić je w cudzysłowie: $ let 4*8 Ważną cechą polecenia let jest fakt, że wynik operacji można umieścić w zmiennej np. $ let iloczyn = 5 *23 $ echo $iloczyn 115
Instrukcja warunkowa: Składnia tej instrukcji jest następująca: if warunek then instrukcje wykonywane jeśli warunek zostanie spełniony else instrukcje wykonywane jeśli warunek nie zostanie spełniony fi W polu warunek można używać następujących operacji: PORÓWNANIA LICZBOWE -gt: większy od -lt: mniejszy od -ge: większy, równy od -le: mniejszy, równy od -eq: równy -ne: różny od PORÓWNANIA TEKSTOWE -z: sprawdza czy ciąg jest pusty -n: sprawdza wartość ciągu =: równy!=: różny Str: sprawdza czy ciąg jest zerowy OPERACJE LOGICZNE -a: Logiczne i (zamiast -a można stosować &&) -o: Logiczne lub (można stosować też )!: Logiczne nie TESTY NA PLIKACH -f nazwapliku: Plik istnieje i jest zwykłym plikiem -s: Plik nie jest pusty -r: Plik jest możliwy do odczytu -w: Plik może być modyfikowany -x: Plik może być uruchamiany -d: Jest katalogiem -h: Jest dowiązaniem symbolicznym -c: Nazwa odnosi się do urządzenia Pętle. Skrypty powłoki mogą także zawierać pętle podstawowe dwie z nich to pętla for oraz while. Pętla for wykonywana jest z góry określoną ilość razy, a jej ogólna składnia jest następująca: for zmienna in lista do instrukcje do wykonania done Wykonanie pętli powoduje przypisywanie zmiennej zmienna kolejnych wartości wymienionych na liście lista; ilość iteracji, jest zatem zależna od długości podanej listy. Jako listę można pętli for można podawać wzorce uogólniające powłoki. Poniższy przykład skryptu prezentuje zastosowanie pętli for do usunięcia wszystkich plików z rozszerzeniem.tmp z katalogu bieżącego: for FILE in *.tmp do rm -v $FILE done
Ilość iteracji powyższej pętli bezie zatem determinowana ilością plików z rozszerzeniem *.tmp, które utworzą listę wartości dla zmiennej FILE. Realizacja pętli numerycznej z zastosowaniem pętli for jest możliwa z użyciem programu seq(1), który wypisuje kolejne liczby, np.: for N in `seq 1 10`... spowoduje dziesięciokrotne wykonanie pętli. Pętla while pozawala na realizację pętli, dla których ilość iteracji nie jest znana z góry, jej składnia dla skryptów powłoki jest następująca: while warunek do instrukcje do wykonania done Warunek może być dowolnym poleceniem i najczęściej jest konstruowany tak jak w przypadku instrukcji warunkowej z zastosowaniem programu test. Przykładem zastosowania pętli while może być skrypt wypisujący na ekranie wartości wszystkich argumentów wywołania skryptu (niezależnie od ich liczby). Pętla taka będzie wykorzystywała polecenie shift(1), które powoduje przesunięcie argumentów oto skrypt: while [ -n $1 ] do echo $1 shift done Warunkiem wykonania pętli jest sprawdzenie, czy pierwszy argument wywołania skryptu ma niezerową długość jeśli skrypt został uruchomiony bez żadnych argumentów, to pętla nie zostanie wykonana. Jeśli natomiast skrypt został wykonany z argumentami, to w pierwszym wykonaniu pętli zostanie wyświetlona wartość pierwszego argumentu, a następnie nastąpi przesunięcie argumentów w lewo poleceniem shift (drugi argument stanie się pierwszym, trzeci drugim itd.). Pętla zakończy się jeśli zostaną wyświetlone i przesunięte wszystkie argumenty (zmienna pozycyjna $1 będzie miała wówczas zerową długość). Obie zaprezentowane pętle mogą zostać przerwane poleceniem break(1). Funkcje - bardzo przydatne ponieważ pozwalają nam na wielokrotne używanie kodu oraz dzielenie go na mniejsze części - odpowiadające tylko za jedną rzecz np. wysyłanie e-maila. Funkcja może również zwracać wartość a więc przekazywać nam wynik obliczeń lub informować czy polecenia przez nią wykonywane zostały zakończone poprawnie. Używamy do tego instrukcji return. Zwrócona wartość znajduje się w zmiennej $?. Można także przekazać parametry do funkcji. Przykład skryptu z funkcjami: function dodaj { wynik=`expr $1 + $2` return $wynik - zwracanie wyniku }
dodaj 1 2 - przekazanie parametrów echo "Wynikiem dodawania jest $?" Komenda cut służy do przetwarzania tekstu. Możesz użyć jej aby wydobyć jakiś tekst z pliku poprzez wybranie kolumn. Utwórzmy plik tekstowy test.txt o zawartości: Lorem ipsum. To jest tekst przykładowy.. Przykłady: cut -c1-3 test.txt wyodrębnia kolumny od 1 do 3 czyli będzie: Lor To cut c-8 test.txt Lorem ip To jest cut c- test.txt cała linia Opcja f i d: -f określa, które słowo mamy wyodrębnić, a opcja d jaki jest znak rozdzielający słowa między sobą w danym pliku. $ cut -d':' -f1 /etc/passwd wyszczególnia nazwę użytkownika. Podstawienie pod zmienną komendy poprzez nawiasy: () oraz backstik: ``. files="$(ls)" web_files=`ls public_html` echo "$files" # potrzeba cudzysłowów aby zachować układ linii w pliku echo "$web_files" X=`expr 3 \* 2 + 4` # expr oblicza wyrazenie arytmetyczne. echo "$X" Bez cudzysłowów znak nowej linii zostaje zastąpiony spacją. Część praktyczna zadania ćwiczeniowe: I. Za pomocą skryptu stwórz w katalogu domowym studenta cztery katalogi: kat1, kat2, kat3, kat4 II. W katalogu nr 1 z pomocą skryptu stwórz plik tekstowy i zapisz w nim kilka linijek tekstu, następnie zamknij plik. Ponownie go otwórz i przepisz tekst na konsolę. Na koniec wyświetl liczbę słów, linii i bajtów dla danego pliku. Tę samą czynność zrób dla katalogu nr 2 (możesz wykorzystać funkcję z parametrami) III. W pliku testowy.txt zamień wszystkie litery a na k. (Pomoc na stronie http://landoflinux.com/linux_bash_scripting_substring_tests.html) IV. Napisz skrypt proszący o nazwę szukanego słowa oraz pliku tekstowego do przeszukania V. Utwórz katalog img. Skopiuj do niego z ftp wszystkie pliki *.JPG; Wyobraź sobie, że są to pliki, które właśnie skopiowałeś z karty pamięci aparatu i chcesz je posortować w katalogach o nazwie zgodnej z datą Wiesz, że: W pakiecie ImageMagick znajduje się program identify, służący do podglądu metadanych zdjęć, w tym danych exif
Dane exif zawierają datę utworzenia zdjęcia Zainstaluj wspomniany pakiet i uruchamiając identify -verbose nazwa-zdjecia.jpg sprawdź jakie dane są wyświetlane. Odnajdź wpis zawierający datę wykonania zdjęcia. Za pomogą polecenia grep przefiltruj wyjście tego programu tak, aby jedyną wyświetlaną linią była ta zawierająca datę. Za pomocą polecenia cut spróbuj wyciąć datę, użyj parametrów dznak (znak oddzielający) oraz fliczba (czyli numer kolumny). Za pomogą składni zamiany w ciągach możesz zastąpić dwukropki rozdzielające pola daty myślnikami: ${DATA//\:/-} Masz już wszystkie potrzebne informacje. Napisz skrypt, który dla wszystkich plików *.JPG w katalogu img sprawdzi datę ich utworzenia, jeżeli to konieczne, utworzy katalog o nazwie takiej jak data, a następnie przeniesie ten plik do niego. Po wykonaniu zadania wyświetl wynik polecenia ls R w katalogu img i wyślij plik sort.sh na serwer ftp. VI. Wyobraź sobie, że pracujesz w firmie programistycznej jako administrator serwera testowego dla developerów. Wszyscy programiści mają na tym serwerze swoje konta i należą do grupy users. Na serwerze jest uruchomiony serwer www, który dla każdego z programistów udostępnia wszystkie jego projekty testowe. Wszystkie projekty przechowywane są w katalogach /home/nazwaużytkownika/www/nazwa-projektu/. Napisz skrypt, który przyjmuje dwa parametry: nazwę użytkownika oraz nazwę projektu i: 1. tworzy plik konfiguracyjny serwera na podstawie wzorca zamieszczonego niżej i zapisuje go w pod nazwą /etc/konfiguracja-www/projekty/nazwauzytkownika_nazwa-projektu.conf 2. Tworzy katalog bazowy dla projektu według wzorca: /home/nazwa-użytkownika/www/nazwa-projektu/. Wzorzec pliku konfiguracyjnego: <VirtualHost *:80> ServerName nazwa-uzytkownika.nazwa-projektu.firma.pl DocumentRoot /home/nazwa-użytkownika/www/nazwa-projektu </VirtualHost> Uwaga: Katalog /etc/konfiguracja-www/projekty/ może nie istnieć, w takiej sytuacji należy go utworzyć przed wykonaniem zadania. Powyższa konfiguracja jest bardzo uproszczona i służy wyłącznie jako przykład. Następnie napisz skrypt, który dla wszystkich użytkowników z grupy users utworzy projekty przekazane jako kolejne parametry skryptu. Skrypt wewnętrznie powinien użyć skryptu stworzonego powyżej.