to get the file

Transkrypt

to get the file
Laboratorium nr 1
Instrukcja
laboratoryjna
1
1)
1/7
Język C
Temat: Programowanie w powłoce bash (shell scripting)
Przygotował: mgr inż. Maciej Lasota
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
3)
2/7
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).
Zmienna ->
$0 – zmienna zawiera nazwę danego skryptu,
Zmienne ->
$1...$9 - parametry zewnętrzne przekazywane do
skryptu (od 1 do 9),
Zmienna ->
$@
-
zmienna
zawiera
wszystkie
parametry
przekazywane do skryptu,
Zmienna ->
@? - zmienna przechowuje kod powrotu ostatnio
wywołanego
polecenia
(0
oznacza
wykonanie polecenia),
Zmienna ->
3.3)
$$ - PID procesu bieżącej powłoki.
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
poprawne
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
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
5/7
Laboratorium nr 1
3.7)
W
6/7
Wyświetlanie i wczytywanie danych
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.