Pracownia specjalistyczna Materiały przygotowali: mgr inż. Wojciech Frohmberg, mgr inż. Michał Kierzynka
Edytory Linuxa Część 1. Podstawowe komendy edytora vim edytor vim przyjmuje w parametrach pliki edytowania np. : # vim plik.txt przełączanie pomiędzy trybami edytora: Przełączenie trybu edycji: i wstawia kursor przed karetką a wstawia kursor za karetką I wstawia kursor na początku linii po wszystkich spacjach i tabulatorach A wstawia kursor na końcu linii Przełączenie trybu zaznaczania tekstu: v zorientowanego na literki V zorientowanego na linie <Ctrl> v zorientowanego na bloki komendy trybu zaznaczania tekstu: y skopiuj (ang. yank wyrywać) tekst i przejdź trybu komend x wytnij tekst i przejdź trybu komend podstawowe komendy trybu komend: p wklej za kursorem P wklej w miejscu kursora
h j k l nawigowanie (zastępczo za strzałki) :w <nazwa pliku><enter> zapisz plik jako <nazwa pliku> :w<enter> zapisz plik :q<enter> wychodzi z programu :q!<enter> wymusza wyjście z programu w przypadku gdy plik nie jest zapisany :wq<enter> zapis i wyjście z programu :o <nazwa pliku><enter> otwieranie pliku <nazwa pliku> ZADANIA Zad 1. Za pomocą edytora vim stwórz plik plik.txt i napisz w nim kilkulinijkowy (sensowny) tekst. Następnie zapisz plik i wyjdź z edytora. Zad 2. Otwórz wcześniej utworzony plik. Skopiuj pierwszą linię i wklej na końcu pliku. Zapisz plik jako wyedytowany plik.txt. Zad 3. Wytnij drugie słówko z pierwszej linii i wstaw jako drugie słówko drugiej linii. Zamknij plik bez zapisywania.
Część 2. Rozszerzone komendy trybu komend. wyszukiwanie tekstu: /<wzorzec tekstu><enter> lub?<wzorzec tekstu><enter> szukaj następnego wystąpienia: /<Enter> lub N szukaj poprzedniego wystąpienia:?<enter> lub n u cofa wykonaną zmianę <Ctrl> r przywraca uprzednio wycofaną zmianę yy kopiuje wybraną linię tekstu y<liczba>y kopiuje liczbę <liczba> linii rozpoczynając od miejsca w znajduje się kursor yw kopiuje słowo rozpoczynając od miejsca w którym znajduje się kursor y<liczba>w kopiuje liczbę <liczba> słów rozpoczynając od miejsca w którym znajduje się kursor yl kopiuje literę z miejsca w którym znajduje się kursor y<liczba>l kopiuje liczbę <liczba> liter rozpoczynając od miejsca w którym znajduje się kursor y0 kopiuje wszystko od początku linijki miejsca w którym znajduje się kursor yg kopiuje wszystko od miejsca w którym znajduje się kursor końca pliku dd usuwa linię w której znajduje się kursor d<liczba>d usuwa liczbę <liczba> linii rozpoczynając od miejsca w znajduje się kursor pobnie jak w przypadku komendy kopiowania y można przez zastąpienie y na d można utworzyć komendy usuwające wybraną przez nas część pliku gg przechodzi na początek pliku g0 przechodzi na początek linii G przechodzi na koniec pliku :<liczba><enter> przechodzi linii <liczba> <liczba>% przechodzi linii która odpowiada procentowi <liczba> części pliku :s/<wzorzec>/<tekst>/<enter> zamienia pierwsze wystąpienie (po kursorze) wzorca <wzorzec> na wybrany tekst <tekst> :% s/<wzorzec>/<tekst>/<enter> zamienia wszystkie wystąpienia wzorca <wzorzec> na tekst <tekst> :<liczba1>[,<liczba2>] s/<wzorzec>/<tekst>/<enter> zamienia wszystkie wystąpienia wzorca <wzorzec> w linii <liczba1> (przedziale linii od <liczba1> <liczba2>) na tekst <tekst> ZADANIA Zad 1. Utwórz plik wierszyki.txt. Skopiuj tekst: NIEDŹWIEDŹ Proszę państwa, oto miś. Miś jest bardzo grzeczny dziś, Chętnie państwu łapę poda. Nie chce podać? A to szkoda. TYGRYS Co słychać, panie tygrysie? A nic. Nudzi mi się. Czy chciałby pan wyjść zza tych krat?
Pewnie. Przynajmniej bym pana zjadł. STRUŚ Struś ze strachu Ciągle głowę chowa w piachu, Więc ma opinię mazgaja. A nadto znosi jaja wielkości strusiego jaja. DZIK Dzik jest dziki, dzik jest zły, Dzik ma bardzo ostre kły. Kto spotyka w lesie dzika, Ten na drzewo szybko zmyka. PAPUGA Papużko, papużko, Powiedz mi coś na uszko. Nic nie powiem, boś ty plotkarz, Powtórzysz każdemu, kogo spotkasz. LIS Rudy ojciec, rudy dziadek, Rudy ogon to mój spadek, A ja jestem rudy lis. Ruszaj stąd, bo będę gryzł. WILK Powiem ci w słowach kilku, Co myślę o tym wilku: Gdyby nie był na obrazku, Zaraz by cię zjadł, głuptasku. ŻÓŁW Żółw chciał pojechać koleją, Lecz koleje nie tanieją. Żółwiowi szkoda pieniędzy: Pójdę pieszo, będę prędzej. ZEBRA Czy ta zebra jest prawdziwa? Czy to tak naprawdę bywa? Czy też malarz z bożej łaski Pomalował osła w paski? KANGUR Jakie pan ma stopy duże, Panie kangurze! Wiamo, dlatego kangury W skarpetkach robią dziury. I wklej go swojego pliku za pomocą skrótu <Ctrl> <Shift> v. Zapisz plik. Zad 2. Posortuj wierszyki za pomocą wycinania i wklejania alfabetycznie ze względu na zwierzęta. Zad 3. Zamień wszystkie wystąpienia słowa pan na Pan. Zad 4. Usuń ostatnie 6 linii pliku z wierszykami.
Część 3. Zaawansowane komendy edytora vim Zarządzanie kartami: :tabnew<enter> otwiera nową kartę edytora :tabnext<enter> przełącza następnej karty :tabprev<enter> przełącza poprzedniej karty :tabclose<enter> zamyka kartę :help :tab<enter> otwiera manuala tyczącego kart Zarządzanie okienkami: <Ctrl> w, n tworzy nowe okno <Ctrl> w, <Ctrl> w przejdź następnego okna <Ctrl> w, x wymienia aktywne okno na ostatnio używane :help winw wyświetla manuala tyczącego okien z ciekawostek :) :Sex<Enter> umożliwia otwarcie w nowym oknie wybranego pliku z bieżącej lokalizacji :set number<enter> wyświetla numery linii :set nonumber<enter> wyłącza wyświetlanie numerów linii :syntax on<enter> włącza podświetlanie składni :sh otwiera konsolę żeby wrócić edytora wystarczy wpisać w konsoli exit<enter> ZADANIA Zad 1. Przetestuj wyżej wymienione komendy.
Część 4. Edytor mcedit. komendy edytora mcedit: <F1> pomoc <F2> zapisz <F3> zaznacz <F4> zastąp <F5> skopiuj (i wklej w miejsce kursora) <F6> wytnij (i wklej w miejsce kursora) <F7> szukaj <F8> usuń <F9> otwórz menu <F10> zakończ ZADANIA Wykonaj zadania z pierwszej części skryptu korzystając z edytora mcedit
Skrypty bashowe Część 1. Składnia podstawowych instrukcji Nagłówek pliku skryptowego #!/bin/bash Komentarz #<wolny tekst> Deklarowanie zmiennych <etykieta>=<wartość> UWAGA!!! W instrukcjach basha bardzo ważna jest obecność (bądź ich brak) znaków białych w tym również enterów Korzystanie ze zmiennej: $<etykieta> lub ${<etykieta>} Zmienne specjalne: $$ id procesu skryptu $! id procesu ostatnio odpalonego w tle (za pomocą &) $0 odpowiada nazwie skryptu $<cyfra> odpowiada parametrowi o numerze <cyfra> $# w zmiennej przechowywana jest ilość parametrów przekazanych skryptu $? odpowiada wartości liczbowej zwróconej przez ostatni odpalony proces Instrukcja warunkowa: if [[ <warunek> ]] then <instrukcje> fi lub if [[ <warunek> ]] then <instrukcje> else <instrukcje> fi Przykławy skrypt:
#!/bin/bash W=2 if [[ $W eq 2 ]] then echo Ahaaa!!! ; fi wyrażenia warunkowe Składnia wyrażenia warunkowego całkowitoliczbowego: [[ <wartość> <operator> <wartość> ]] Lista operatorów dla liczb całkowitoliczbowych: eq testuje równość liczb ne testuje czy liczby nie są równe gt testuje czy pierwsza z podanych liczb jest większa od drugiej ge testuje czy pierwsza z podanych liczb jest większa lub równa drugiej lt testuje czy pierwsza z podanych liczb jest mniejsza od drugiej le testuje czy pierwsza z podanych liczb jest mniejsza lub równa drugiej Składnia binarnego wyrażenia warunkowego dla ciągów znaków: [[ "<zmienna>" <operator bin> "<zmienna>" ]] Lista operatorów binarnych dla ciągów znaków: ==!= < pierwsza zmienna jest mniejsza od drugiej w kontekście ciągów znaków > pierwsza zmienna jest większa od drugiej w kontekście ciągów znaków Składnia unarnego wyrażenia warunkowego dla ciągów znaków: [[ <operator un> "<zmienna>" ]] Lista operatorów unarnych dla ciągów znaków: z testuje czy zmienna jest nullem (tzn. czy ma długość 0) n testuje czy zmienna nie jest nullem (tzn. czy nie ma długości 0) wywoływanie skryptu bashowego (hash ma imitować znaki ścieżki): # bash <nazwa_skryptu> lub # chmod u+x <nazwa_skryptu> #./<nazwa_skryptu>
ZADANIA Zad 1. Utwórz i przetestuj skrypt wypisujący na ekran hello world Zad 2. Utwórz i przetestuj skrypt który testuje liczbę parametrów podanych skryptu i w przypadku gdy jest ona większa od 10 wypisuje liczba parametrów większa od 10. Zad 3. Utwórz i przetestuj skrypt, który sprawdza czy pierwszy parametr skryptu jest mniejszy od numeru wątku skryptu. Jeśli tak wypisuje zawartość bieżącego katalogu, jeśli nie ścieżkę bieżącego katalogu. (komenda wypisująca ścieżkę bieżącego katalogu to pwd).
Część 2. Pętle i rozszerzone instrukcje basha składnia podstawowej pętli while while [[ <warunek> ]] <instrukcje> ne sczytywanie linia za linią w pętli while read a <instrukcje> ne sczytywanie linia za linią w pętli z pliku while read a <instrukcje> ne < <nazwapliku> składnia pętli for for <zmienna> in <zakres> <instrukcja> ne Przykławo: for i in 1 2 3 4 5 echo $i ne lub for i in {1..5} echo "hello $1" ne zamiast niegdysiejszego: for i in `seq 1 5` echo "hello $i" ne Zakres można podawać również z wartością o którą interpreter ma
inkrementować zmienną iterowaną: {<wartość początkowa>..<wartość inkrementowana>..<wartość końcowa>} przerywanie pętli break; ciąg znaku wypisywany przez instrukcję jako wartość `<instrukcja>` Przykławo: wypis=`ls` zapiszę zmiennej $wypis wszystkie pliki z bieżącego katalogu ZADANIA Zad 1. Wypisz 10 linii z aktualnym czasem (date). Zad 2. Dla każdej z podanych przez użytkownika linii wypisz napis hello <tekst użytkownika> aż momentu kiedy w tekście nie będzie napisu exit. Zad 3. Zapisz pliku (podanego jako pierwszy parametr skryptu) każdą z linii podanych przez użytkownika momentu kiedy nie napisze exit. ZADANIA ZAAWANSOWANE Zad 1. Napisz skrypt zmieniający rozszerzenia wszystkich plików w bieżącym katalogu z wartości wskazanej pierwszym argumentem z wartością wskazanej drugim argumentem. Skorzystaj z polecenia basename. Przykławe wywołanie: # zmien.sh txt c Zad 2. Napisz skrypt sortujący zawartości wszystkich plików o rozszerzeniach wskazanych pierwszym argumentem i znajdujących się w podkatalogach katalogów wskazanych pozostałymi argumentami.