Laboratorium nr 1 1/7 Język C Instrukcja laboratoryjna Temat: Programowanie w powłoce bash (shell scripting) 1 Przygotował: mgr inż. Maciej Lasota 1) Wprowadzenie do programowania w powłoce Skrypt powłoki (skrypt wsadowy) to zbiór komend danej powłoki zapisany w postaci pliku z atrybutami wykonywania. Skrypty tworzymy w standardowych plikach tekstowych typu ASCII, zawierają one komendy powłoki wraz z dodatkowymi zmiennymi, instrukcjami sterującymi np. instrukcjami warunkowymi, pętlami itp.. Tak stworzone skrypty wykonywane (interpretowane) są przez powłokę danego systemu operacyjnego. Ponieważ w systemach operacyjnych z rodziny Unix/Linux dostępnych jest kilka rodzajów powłok (sh, csh, ksh, zsh, bash) każda z nich w inny sposób interpretuje skrypty. UWAGA!!! Powłoki systemowe nie zawsze są ze sobą kompatybilne składniowo. Jedną z najpopularniejszych i najczęściej spotykanych powłok w systemach uniksowych jest bash. Jest ona domyślną powłoką w większości dystrybucji systemu Unix/Linux oraz w systemie Mac OS X od wersji 10.3, istnieją także wersje dla środowiska Cygwin dla systemów Win32. Powłoka bash umożliwia pracę interaktywną i wsadową (skrypty). Składania powłoki bash umożliwia definiowanie zmiennych, stałych, tablic, aliasów, funkcji i podprogramów, posiada konstrukcje sterujące (if, case, while, for) oraz wiele innych dodatkowych funkcji pozwalających na pisanie zaawansowanych skryptów. 2) Tworzenie pliku tekstowego Jak już zostało wspomniane skrypt powłoki tworzymy w zwykłym standardowym pliku tekstowym. Do stworzenie pustego pliku tekstowego w systemach z rodziny Unix/Linux, możemy wykorzystać np. komendę touch. touch mojskrypt.sh UWAGA!!! Zazwyczaj pliki będące skryptami powłoki mają rozszerzenie *.sh, jest to zasada umowna.
Laboratorium nr 1 2/7 3) Ogólna składnia skryptu powłoki Podstawowy szkielet skryptu powłoki został przedstawiony poniżej: # Nagłówek (może być #!/bin/sh lub #!/bin/bash) # określa nam powłokę która ma wykonywać nasz skrypt #!/bin/bash # Cześć deklaracyjna, w części tej mogą znajdować się # zadeklarowane zmienne, stałe, tablice, funkcje, itd. echo Witaj # Komentarze w skrypcie poprzedzamy znakiem # hash'a Aby uruchomić i zaprezentować działanie tak stworzonego skryptu powłoki, należy nadać mu odpowiednie systemowe prawa wykonywania. Atrybuty wykonywania dla pliku można nadać za pomocą polecenia chmod. Polecenie to przyjmuje tzw. maskę określającą prawa w postaci 3 liczb (dla właściciela, grupy i pozostałych) oraz nazwę pliku. chmod 755 mojskrypt.sh UWAGA!!! Więcej informacji na temat nadawania atrybutów plikom i katalogom można znaleźć w podręcznikach systemowych tzw. manualach man chmod Skrypt powłoki wykonujemy (uruchamiamy) wpisując./mojskrypt.sh lub sh mojskrypt.sh. Wszystko umieszczone po znaku # aż do końca linii jest komentarzem. Pierwszy wiersz pliku powinien wyglądać następująco: #!/bin/bash. Polecenie echo służy do wyświetlania danych (komunikatów) na ekranie monitora. 3.1) Zmienne Zmienne w skryptach deklarujemy w następujący sposób: nazwa_zmiennej= wartość zmiennej
Laboratorium nr 1 3/7 Jako wartość możemy podać liczbę, napis lub polecenia systemowe, polecenia podajemy w postaci odwrotnych apostrofów `polecenie` lub $(polecenie). Do zmiennej odwołujemy się poprzez znak dolara $. 3.2) Zmienne specjalne Zmienne specjalne (predefiniowane), są często wykorzystywane w skryptach powłoki (zazwyczaj są tylko do odczytu). Zmienne -> $0 zmienna zawiera nazwę danego skryptu, $1...$9 - parametry zewnętrzne przekazywane do skryptu (od 1 do 9), $@ - zmienna zawiera wszystkie parametry przekazywane do skryptu, @? - zmienna przechowuje kod powrotu ostatnio wywołanego polecenia (0 oznacza poprawne wykonanie polecenia), $$ - PID procesu bieżącej powłoki. 3.3) Instrukcje warunkowe Instrukcja warunkowa IF: if warunek then polecenie fi lub IF-ELSE: if warunek then polecenie 1 else polecenie 2 else polecenie 3 fi
Laboratorium nr 1 4/7 Instrukcja warunkowa (wyboru) CASE: case $zmienna in wzorzec1 ) polecenie1 (break/continue/exit);; wzorzec2 ) polecenie2 (break/continue/exit);; *) polecenie (break/conitnue/exit);;... esac 3.4) Instrukcje pętli Instrukcja pętli WHILE: while warunek do polecenie... done Instrukcja pętli FOR: for zmienna in arg1 arg2 arg3... do polecenie done 3.5) Tablice Deklaracja tablicy: zmienna=(wartość1 wartość2 wartość3...) echo ${tablica[*]} wyświetlanie wszystkich elementów tablicy, echo ${#tablica[0]} wyświetlanie długości znaków podanego elementu, echo ${#tablica[@]} wyświetlanie liczby wszystkich elementów w tablicy.
Laboratorium nr 1 5/7 unset tablica[6] usuwanie elementu, echo ${tablica[*]} tablica[6]=tekst przypisywanie elementu, tablica[7]=tekst2 echo ${tablica[*]} unset tablica[*] usuwanie całej tablicy echo ${tablica[@] 3.6) Przekierowania i strumienie pwd > plik.txt # zapisanie ścieżki do pliku more < plik.txt # wyświetlenie pliku na ekranie cat plik1.txt > plik2.txt # zpisanie pliku1.txt do pliku2.txt ls *.txt >> plik3.txt # dopisanie do pliku3.txt ps aux more # wysłanie strumienia danych do programu more ps aux grep apache # wysłanie strumienia danych do programu grep ps aux grep cron sort > plik.txt
Laboratorium nr 1 6/7 3.7) Wyświetlanie i wczytywanie danych W celu wyświetlanie danych na ekranie monitora (standardowe wyjście) wykorzystujemy polecenie echo: echo -n Tekst do wyświetlenia echo -e \t Tekst do wyświetlenia i dodatkowo zmienna $a \n\n Rodzaje parametrów: -n nie wysyła znaku końca linii (brak przejścia do nowej linii), -e włącza interpretację parametrów wewnątrz tekstu, Rodzaje parametrów wewnątrz tekstu: \n - przejście do nowej linii, \a alert (dzwonek), \b - backspace, \c - pomija znak końca nowej linii, \f - escape, \r - znak nowej linii, \t tabulacja, \\ - backslash. W celu wczytania danych do zmiennej wykorzystujemy polecenie read : read [operator][zmienna] read a b echo $a echo $b read -e echo $REPLY
Laboratorium nr 1 7/7 Rodzaje operatorów: -a pokaż znak zachęty bez kończącego znaku nowej linii, -p wczytywanie danych do tablicy, -e jeśli nie podano żadnej zmiennej dane trafią do zmiennej systemowej $REPLY.