...

Kurs pisania skryptów w Linuksie



Uruchamianie skryptów

Skrypty uruchamiamy na kilka sposobów:

poprzez wpisanie:

     bash skrypt

nadając plikowi prawo wykonywania:

     chmod +x skrypt

a następnie uruchomienie:

     ./skrypt

najprościej:

     skrypt

Aby tak uczynić należy spełnić jeden z dwóch warunków: Skopiować plik do katalogu ~./bin lub do /usr/bin albo zmodyfikować zmienną $PATH.




Wyświetlanie tekstu


#!/bin/bash
echo "ten tekst zostanie wyswietlony"
echo "w dwoch wierszach"

Aby oba teksty zostały wyświetlone w jednej linii trzeba dopisać parametr-n do polecenia echo. Wtedy nie jest dodawany znak nowego wiersza:


#!/bin/bash
echo -n "To jest tylko"
echo "jedna linijka tekstu"

Zeby spowodować przejście do nowego wiersza, należy użyć znaku \n oraz parametru -e dla polecenia echo.


#!/bin/bash
echo -e "To jest pierwszy wiersz \n a to drugi"

Przekierowania

Wyniki działań większości poleceń wysyłane są bezpośrednio na ekran monitora. Jednak często zdarza się że chcielibyśmy zapisać je w postaci pliku. Tutaj z pomocą przychodzą przekierowania strumieni. Przykładowo chcąc zapisać listę plików wyświetlaną poleceniem ls do pliku zrobilibyśmy następująco:

ls > plik

Jeśli taki plik już istniał zostanie nadpisany, czyli stara zawartość zginie i zostanie zastąpiona nową. Jeżeli nie było pliku o tej nazwie zostanie on utworzony. Dopisanie do pliku bez usuwania starej zawartości odbywa się za pomocą dwóch strzałek:

ls >> plik

Często zdarza się że chcemy zapisać komunikaty błędów. W tym wypadku musimy odebrać dane ze strumienia błędów. Robimy to pisząc 2> jako znak przekierowania:

ls 2> plik

Ponieważ polecenia sl nie ma w systemie - do pliku zostanie zapisany komunikat błędu Jeżeli chcemy szybko zapisać jakiś wyraz do pliku, wcale nie musimy otwierać żadnego edytora tekstu. Wystarczy zrobić przekierowanie polecenia echo:

echo "Jakiś napis" > plik

A co w przypadku gdy jednocześnie chcemy wysłać dane na ekran oraz do pliku? Tu z pomocą przychodzi nam programik o nazwie tee, który wstawiony w potok za naszym poleceniem wysyła dane jednocześnie na ekran i na twardy dysk. Robi się to następująco:

ls | tee plik

Teraz pokażę jak połączyć wiele plików w jeden za pomocą polecenia cat i oczywiście przekierowań. Polecenie cat wyświetla zawartość pliku (lub kilku).

cat plik1 plik2 > plik3

W ten prosty sposób dane z obydwu plików znalazły się w postaci jednego dużego pliku. Co więcej - możemy nawet dokonać podobnej czynności z wszystkimi plikami w bieżącym katalogu stosując zamiast nazwy pliku gwiazdkę:

cat * > wszystkie

Istnieje również mechanizm wczytania danych za pomocą odwrotnego przekierowania. Bliżej poznamy go w następnych rozdziałach. Teraz dam tylkko krótki przykład jak można za jego pomocą pobrać tekst z pliku i wysłać do pocztą elektroniczną:

mail adres@wp.pl < plik_z_wiadomoscia

Dla uściślenia dodam jak nazywają sie kierunki strumieni danych: stdin - wejście stdout - wyjście podstawowe stderr - wyjście diagnostyczne




Aliasy

Alias to po prostu druga nazwa dla danego polecenia.

Jeśli napiszemy:

alias ll="ls -l"

lub

alias ll='ls -l'

będziemy mogli używać zamiast ls -l polecenie ll , które jest znacznie krótsze.

Uwaga: alias ten zniknie po wylogowaniu!

Aby zachować alias należy go dopisać do któregoś ze skryptów startowych np.:

~/.bashrc

lub do

/etc/profile

W tym przypadku alias będzie dostępny dla wszystkich użytkowników.

Można to zrobić w ten sposób:

echo "alias ll=\"ls -l\"" >> ~./bashrc

Listę dostępnych aliasów wyświetlamy poleceniem: alias .

Często używane aliasy:


alias vi='vim'
alias md='mkdir'
alias sl='ls'

Polecenie

unalias
usuwa alias z pamięci.


Przeszukiwanie plików

Program grep przeszukuje plik i wyświetla linie pasujące do wzorca (czyli linie które zawierają szukane słowo). składnia:


grep szukane_slowo plik

# wiersze zawierające słowo "Linux" w pliku "konfiguracja":


grep Linux konfiguracja

# wiersze ze słowem mariusz w pliku /etc/passwd


grep mariusz /etc/passwd

# wiersze ze słowem Linux we wszystkich plikach *.txt, *.htm i *.html


grep Linux *.{txt,htm?}

Zmienne definiowane przez użytkownika

Zmienna przechowuje jakąś wartość. Odwołujemy się do niej (odczytujemy ją) pisząc znak $ bezpośrednio przed nazwą zmiennej.


#!/bin/bash
zdanie="Witaj swiecie !!!"
echo $zdanie

Wartości zmiennych można pobrać bezpośrednio od użytkownika:


#!/bin/bash
echo -n "Podaj imię: "
read imie
echo -n "Wiek: "
read wiek
echo "Twoje imię $imie i masz $wiek lat"
echo "Za 5 lat będziesz mieć $[ wiek+5 ] lat"

W ostatnim wierszu można zaobserwować dodawanie liczby 5 do wartości zmiennej. Inne przykłady działań na liczbach przedstawiam poniżej.


a=1
a=$[a+1]            # 2
a=$((a+1))         # 2
let "a=a+1"        # 2
let "a+=1"          # 2

a=`expr $a + 1`

Najprostszy kalkulator


#!/bin/bash
echo
echo -n "Podaj dwie liczby oddzielone spacją: "
read a b

dodawanie=$[ a+b ]
odejmowanie=$[ a-b ]
mnozenie=$[ a*b ]
dzielenie_calkowite=$[ a/b ]

echo "Podane liczby: $a, $b"
echo
echo "Wynik dodawania: $dodawanie"
echo "Wynik odejmowania: $odejmowanie"
echo "Wynik mnozenia: $mnozenie"
echo "Wynik dzielenia calkowitego: $dzielenie_calkowite"

Zapis: dodawanie=$a+$b nie zadziała prawidłowo, tzn nie doda wartości zmiennych i tym samym nie przypisze wyniku zmienej $dodawanie. Teraz pokażę że zapisy: echo $zmienna i echo "$zmienna" mogą dawać różne rezultaty:


#!/bin/bash

napis="Pisanie     skryptow     nie     jest     trudne"

echo $napis       # Pisanie skryptow nie jest trudne
echo "$napis"       # Pisanie     skryptow     nie     jest     trudne

Zapis zmiennej tekstowej bez cudzysłowu usuwa nadwymiarowe odstępy. Aby zmienna była widoczna w innych powłokach należy ją wyeksportować:

export zdanie

Usuwanie zmiennej z pamieci:

unset zdanie 

Zmienne systemowe

W Linuksie istnieje wiele wbudowanych zmiennych. Aktualną ich liste wyświetlamy poleceniami set oraz printenv. Można ich używać następująco:


#!/bin/bash
echo "Witaj $USER, Twoj katalog domowy to $HOME, nazwa i typ tego komputera to $HOSTNAME $HOSTTYPE, znajdujesz sie w katalogu $PWD"

Przykładowe wyniki mogą być następujące


Witaj mariusz, Twoj katalog domowy to /home/mariusz, nazwa i typ tego komputera to unix i386, znajdujesz sie w katalogu /tmp. 

Tablice

Tablice stosujemy gdy potrzeba przechować wiele zmiennych. składnia:


tablica[nr_elementu]=wartosc

np. jesli mamy spis uczniów w klasie mozemy ich dane zapisać nastepujaco:



# zapisujemy dane w tablicy o nazwie klasa
# uwaga: tablica zawsze zaczyna sie od elementu 0 !


klasa[0]="Ewa M"
klasa[1]="Aleksandra D"
klasa[2]="Adam S"
klasa[3]="Angelika C"

# odczytujemy dane ucznia nr 2

echo ${klasa[2]}

# lub cala tablice używając gwiazdki

echo ${klasa[*]}

# odczytujemy liczbe wszystkich uczniow
# poprzez dodanie znaku # bezpośrednio przed nazwą klasy

echo ${#klasa[*]}

Warto wspomnieć że liczba wszystkiech elementow tablicy zawiera rowniez elementy niezdefiniowane tzn. jeśli napiszemy:

klasa[25]="Joanna"

to polecenie wyświetlające ilość wszystkich elementów tablicy

echo ${#klasa[*]}

wyświetli 26 . Po prostu bash liczy elementy od zera do ostatniego elementu, nie sprawdzając czy pod danym indeksem znajduje sie sensowna wartość. Jeśli zależy nam na sprawdzeniu ile elementów jest rzeczywiście przypisanych - mozna to sprawdzić za pomocą pętli - przykład jest _tutaj_. Wyświetlenie zawartości tablicy klasa za pomocą pętli


#!/bin/bash

# wprowadzanie danych

klasa[0]="Ewa M"
klasa[1]="Aleksandra D"
klasa[2]="Adam S"
klasa[3]="Angelika C"

liczba_elem=${#klasa[*]}
i=0

# dopoki i < liczba_el

while [ $i -lt $liczba_elem ]
do
echo ${klasa[i]} # Wyswietl biezacy element
i=$[i+1] # Zwieksz licznik o 1
done

Wygodnie byłoby aby program pytał o nazwiska uczniów i zapisywał je w tablicy. Można to zrobić następująco: BAZA DANYCH UCZNIOW Dane umieszczone sa w pamieci RAM


#!/bin/bash

echo -e "\nWprowadzanie danych:\n (aby zakonczyc, zamiast wpisywac dane ucznia - wcisnij enter)\n"

i=1 # numer poczatkowy ucznia = 1 [w dziennikach szkolnych liczymy od 1
# a nie od zera (choc mozna i tak :-) )]
while [ 1 ] # petla nieskonczona
do
echo -n "Uczen $i: "
read "klasa[$i]"

if [ "${klasa[$i]}" = "" ]# jesli uzytkownik zatwierdzil pusty wiersz
then
# wyjdz z petli
break
fi

i=$[i+1]
done

ilosc_uczniow=${#klasa[*]}

echo -e "Wyswietlanie bazy danych:\n\n"

# Jesli $ilosc_uczniow = 1 wyswietl komunikat i wyjdz z kodem powrotu = 0
if [ $ilosc_uczniow -eq 1 ] ; then echo "Brak uczniow w bazie";exit 0;fi

# dopoki $i < $ilosc_uczniow
# wyswietl ich

i=1
while [ $i -lt $ilosc_uczniow ]
do
echo -n "$i. " # numer ucznia
echo "${klasa[$i]}" # nazwisko ucznia
i=$[i+1]
done

echo # pusty wiersz


Mozna byloby w ogóle nie używać tablic tylko umiescic dane w pliku tekstowym - przykład jest w dziale ze skryptami.

Wywołania programów ze skryptu

Aby wyświetlić w skrypcie wynik działania zewnętrznego programu, umieszczemu jego wywołanie w odwrotnych cydzysłowach (tych po lewej stronie klawiatury)


echo `date` # nie kwi 11 02:21:54 CEST 2004
echo "`date`" # nie kwi 11 02:21:54 CEST 2004

Oba powyższe polecenia dają identyczne rezultaty, jednak nie zawsze tak jest - wystarczy popatrzeć na wyniki działania poleceń: echo `ls /` oraz echo "`ls /`":


echo `ls /`

bin boot dev etc home initrd lib lost+found misc mnt opt proc root sbin tmp usr var win win2


echo "`ls /`"

bin
boot
dev
etc
home
initrd
lib
lost+found
misc
mnt
opt
proc
root
sbin
tmp
usr
var

Polecenie wywołane z podwójnymi cudzysłowami dodaje znak nowej linii, dzięki czemu wyniki są czytelniejsze. Inne cudzysłowy (lub ich brak) nie dadzą nam upragnionego wyniku:


echo date # date
echo "date" # date
echo 'date' # date

Wiemy już jak wywoływać zewnętrzne programy, możemy zatem zbudować skrypt witający nas po zalogowaniu:


#!/bin/bash
echo "Witaj $USER, dziś jest `date +%A," "%e" "%B" "%Y` roku."

Polecenie to wyświetli tekst podobny do poniźszego:


Witaj mariusz, dziś jest niedziela, 11 kwiecień 2004 roku. 

Warunki

W języku Shell, tak jak i w wielu innych językach programowania, stosuje się tzw. wyrażenia warunkowe które pozwalaja sterowac działaniem programu. test Najkrócej warunek można zapisać w ten sposób

[ $a -eq $b ] && echo "a jest równe b" || echo "Zmienne się różnią"

Czyli: jeśli $a jest równe $b wyświetl komunikat "a jest równe b", w przeciwnym wypadku wyświetl zdanie "Zmienne się różnią". Wyrażenie w nawiasach kwadratowych jest to warunek testujący używający programu test. Test zwraca kod zakończenia równy 0 gdy warunek został spełniony, w innym przypadku kod zakończenia wynosi 1. Lista dostępnych warunków znajduje się na dole strony oraz w man test. if-then-fi


if warunek_jest_spelniony
then
polecenie
fi

Wyrażenie to czytamy następująco: Jeżeli warunek jest spełniony wykonaj polecenie. Skrypt sprawdza czy istnieje plik o nazwie moj_plik oraz informuje nas, jesli jest to prawdą


#!/bin/bash
if [ -e moj_plik ]
then
echo "Masz plik moj_plik"
fi

Bardzo ważne: nawiasy muszą być odzielone spacją, inaczej nie będzie działać. -e oznacza - wyrażenie jest prawdziwe, gdy plik o nazwie moj_plik istnieje (exist) Gdybyśmy chcieli sprawdzić istnienie pliku w swoim katalogu domowym, napisalibyśmy:


if [ -e ~/moj_plik ]


if-then-else-fi

Wyrażenie czytamy następująco: Jeżeli warunek jest spełniony wykonaj polecenie1, jeśli nie jest - wykonaj polecenie2.


if warunek_spelniony
then
polecenie1
else
polecenie2
fi

Skrypt sprawdza czy istnieje plik o nazwie moj_plik oraz generuje odpowiedni komunikat


#!/bin/bash
if [ -e moj_plik ]
then
echo "Masz plik moj_plik"
else
echo "Nie masz pliku moj_plik"
fi
if-then-elif-else-fi

Tego wyrażenia używamy gdy potrzeba sprawdzić kilka warunków, jednak chodzi nam tylko o spełnienie tylko jednego z nich. Wyrażenie to sprawdza po kolei, który warunek jest spełniony, jeśli taki znajdzie wykona polecenie mu przyporządkowane. Jeśli nie będzie spełniony żaden z warunków, wykonane zostanie polecenie widoczne po instrukcji else.


if warunek1
then
polecenie1
elif warunek2
polecenie2
elif warunek3
polecenie3
else
polecenie4
fi

Uwaga: jeśli dodamy znaku wykrzyknika przed warunkiem, to polecenie wykona się tylko wtedy, gdy warunek NIE jest spełniony, np instrukcja


if [ ! -e plik ]
then
polecenie
fi

spowoduje że polecenie wykona się tylko wtedy, gdy plik NIE istnieje. Skrypt sprawdza czy plik o nazwie moj_plik jest zwykłym plikiem, katalogiem, czy dowiązaniem symbolicznym


#!/bin/bash

if [ ! -e moj_plik ] ;then
echo "Plik nie istnieje"
elif [ -f moj_plik ] ;then
echo "Zwykły plik"
elif [ -d moj_plik ];then
echo "Katalog"
elif [ -L moj_plik ];then
echo "Dowiazanie symboliczne"
else
echo "Nie moge dopasowac rodzaju pliku"
fi

Skrypt pyta o hasło i sprawdza czy jest poprawne


#!/bin/bash

echo "Podaj haslo"

read haslo

if [ "$haslo" = "tajne" ]
then
echo "Prawidlowe haslo"
else
echo "Dostep zabroniony"
fi

Skrypt pyta o hasło i sprawdza czy jest poprawne wersja z niewidocznym hasłem


#!/bin/bash
printf "Podaj haslo: "
stty -echo
read haslo
stty echo

if [ "$haslo" = "tajne" ]
then
echo "Prawidlowe haslo"
else
echo "Dostep zabroniony"
fi

Lista ważniejszych warunków: -e plik - prawda, jeśli plik istnieje -d plik - prawda, jeśli plik istnieje i jest katalogiem -f plik - prawda, jeśli plik istnieje i jest zwykłym plikiem -L plik - prawda, jeśli plik istnieje i jest dowiązaniem symbolicznym -r plik - prawda, jeśli plik istnieje i można go czytać -w plik - prawda, jeśli plik istnieje i można do niego pisać -x plik - prawda, jeśli plik istnieje i można go wykonywać -s plik - prawda, jeśli plik istnieje i ma rozmiar większy od zera -g plik - prawda, jeśli plik istnieje i ma ustawiony bit set-group-id -u plik - prawda, jeśli plik istnieje i ma ustawiony bit set-user-id -b plik - prawda, jeśli plik istnieje i jest urządzeniem blokowym -c plik - prawda, jeśli plik istnieje i jest urządzeniem znakowym plik1 -nt plik2 - prawda, jeśli plik1 jest nowszy (zgodnie z datą modyfikacji) niż plik2 plik1 -ot plik2 - prawda, jeśli plik1 jest starszy niż plik2 plik1 -ef plik2 - prawda, jeśli plik1 i plik2 mają te same numery urządzenia i i-węzła -z ciąg - prawda, jeśli ciąg długość równą zero -n ciąg - prawda, jeśli ciąg długość większą od zera ciąg1 = ciąg2 - prawda, jeżeli ciągi są jednakowe ciąg1 != ciąg2 - prawda, jeżeli ciągi są różne ! wyrażenie - prawda, jeżeli wyrażenie jest fałszywe wyrażenie -a wyrażenie -prawda, jeśli oba wyrażenia są prawdziwe wyrażenie -o wyrażenie - prawda, jeżeli przynajmniej jedno z wyrażeń jest prawdziwe argument1 -eq argument2 - prawda, jeśli argument1 jest równy argumentowi2 argument1 -ne argument2 - prawda, jeśli argument1 jest różny od argumentu2 argument1 -gt argument2 - prawda, jeśli argument1 jest większy od argumentu2 argument1 -ge argument2 - prawda, jeśli argument1 jest większy lub równy argumentu2 argument1 -lt argument2 - prawda, jeśli argument1 jest mniejszy od argumentu2 argument1 -le argument2 - prawda, jeśli argument1 jest mniejszy lub równy argumentowi2


Instrukcja wyboru case

Składnia case wygląda następująco


case $nazwa_zmiennej in
"wzorzec1") polecenie1 ;;
"wzorzec2") polecenie2 ;;
.
.
.
*)polecenie
esac

Prosty przykład menu zbudowanego za pomocą case:


#!/bin/bash

echo "Wybierz opcje"
echo "1) Opcja-1"
echo "2) Opcja-2"
echo "3) Opcja-3"

read wybor

case $wybor in
1) echo "Wybrales 1";;
2) echo "Wybrales 2";;
3) echo "Wybrales 3";;
*) echo "Wybrales nieznana opcje" ;;
esac

Skrypt pyta o hasło i sprawdza czy jest poprawne wersja z uzyciem petli while i instrukcji case


#!/bin/bash
while [ 1 ]
do
echo "Podaj haslo dostepu, q - wychodzi ze skryptu"
echo -n "Haslo: "
read haslo

case $haslo in
"admin") echo "Hasło poprawne, witaj adminie" ; break ;;
"student") echo "Hasło poprawne, witaj studencie" ; break ;;
"q") echo "Wyjscie" ; exit ;;
*)continue ;;
esac
done

Dzięki użyciu instrukcji case kod jest bardziej przejrzysty, poza tym teraz łatwo można przyporządkować każdej osobie opowiednie polecenia (oddzielamy je średnikami). Skrypt pokazujący dialog z użytkownikiem:


#!/bin/bash

powitanie="Dzien dobry"
pan="Panu"
pani="Pani"

echo "Czy jestes mezczyzna? (T/N)"
read plec

case $plec in
t) echo "$powitanie $pan";;
T) echo "$powitanie $pan";;

n) echo "$powitanie $pani";;
N) echo "$powitanie $pani";;

*) echo "Niezrozumiala odpowiedz" ;;
esac

Taki sam skrypt napisany z użyciem warunków:


#!/bin/bash

powitanie="Dzien dobry"
pan="Panu"
pani="Pani"

echo "Czy jestes mezczyzna? (T/N)"
read plec

if [ "$plec" = "t" ] || [ "$plec" = "T" ]
then
echo "$powitanie $pan"

elif [ "$plec" = "n" ] || [ "$plec" = "N" ]
then
echo "$powitanie $pani"
else
echo "Niezrozumiala odpowiedz"
fi 


Instrukcja-wyboru-select-case

Jest bardzo podobna do instrukcji Case. Dzięki niej łatwo zbudować menu (nie potrzeba stosować echo do wyświetlania opcji) Składnia:


select nr in 1 2 3
do
case $nr in
"1") Polecenie1
"2") Polecenie2
"3") Polecenie3
"*") Polecenie
esac
break
done

Poniżej skrypt pokazujący jak można zbudować menu za pomocą instrukcji wyboru select-case Skrypt WYBIERZ EDYTOR wersja korzystająca z instrukcji select case


#!/bin/bash
select nr in vi mcedit pico wyjscie
do
case $nr in
"vi") vi ; break ;;
"mcedit") mcedit ; break ;;
"pico") pico ; break ;;
"wyjscie") echo "wyjscie" ; exit ;;
*) continue ;;
esac
break
done 


Pętla while

Pętla wykonuje jakieś działanie wiele razy. Może to być wyświetlanie, zliczanie bądź numeracja wielu plików, pytanie o hasło dopóki użytkownik nie poda właściwego czy dodawanie do siebie wielu kolejnych liczb. While Pętla while wykonuje działanie tylko wtedy gdy warunek jest spełniony. Składnia:


while warunek_jest_prawdziwy
do
instrukcje
done

czyli: dopóki warunek_jest_prawdziwy wykonuj instrukcje zakończ Poniżej przedstawiam prosty skrypt wyświetlający liczby do 1 do 10.


#!/bin/bash

a=1
while [ $a -le 10 ] # dopoki $a <= 10
do
echo "Biezaca liczba: $a" # wyswietlenie biezacej zmiennej
a=$[a+1] # zwiekszenie licznika o 1
done

Instrukcje break i continue służą do sterowania przebiegiem pętli. - break - powoduje natychmiastowe wyjście poza pętlę - continue - powoduje natychmiastowe wykonanie następnego przejścia pętli, bez wykonywania dalszych instrukcji Instrukcja exit powoduje natychmiastowe wyjście ze skryptu. Pętla nieskończona Jeśli napiszemy: while [ 1 ] do instrukcje done to pętla ta będzie wykonywać się bez końca. Jednak dzięki wstawieniu instrukcji break możemy bez żadnego problemu wyjśc z pętli kiedy jest to potrzebne np:


while [ 1 ]
do
echo "Wpisz koniec aby zakonczyc"
read kod
if [ "$kod" = "koniec" ]
then
break
fi
done

echo "Jestem poza petla !"

Jeśli w przypadku wpisania "wyjscie" chcielibyśmy opuścić całkowicie skrypt - używamy instrukcji exit:


while [ 1 ]
do
echo "Wpisz koniec aby zakonczyc"
read kod
if [ "$kod" = "koniec" ]
then
exit
fi
done

echo "To sie nigdy nie wyswietli"

Jeśli chcemy aby po wpisaniu nieprawidłowego hasła komputer zapytał nas o to jeszcze raz (a nawet więcej) to najwygodniej użyć pętli: Skrypt pyta o hasło i sprawdza czy jest poprawne wersja z uzyciem petli while Aby wyjsc nie podajac hasla trzeba nacisnac klawisze CTRL+C


#!/bin/bash

while [ 1 ]
do
echo -n "Podaj haslo: "
read haslo
if [ "$haslo" = "tajne" ]
then
echo "Prawidlowe haslo"
break # wyjscie z petli
else
echo "Dostep zabroniony"
continue # kolejne przejscie petli
fi
done

Jeśli mamy więcej pasujących haseł zamiast:

if [ "$haslo" = "tajne" ]

możemy napisać następująco:

if [ "$haslo" = "tajne" ] || [ "$haslo" = "inne" ]

Znak: || oznacza tzw. sumę logiczną czyli "lub" Elegancko byłoby dodać opcję wyjścia gdy nie znamy hasła Użyjemy do tego instrukcji case, służącej do porównywania ze wzorcem Skrypt MENU wersja korzystająca z instrukcji case oraz działająca w pętli while


#!/bin/bash
while [ 1 ]
do
clear # Czysci ekran
echo "Wybierz edytor który chcesz uruchomić"
echo "1 - vi"
echo "2 - mcedit"
echo "3 - pico"
echo "4 - wyjscie"

read nr
case $nr in
"1") vi ; break ;;
"2") mcedit ; break ;;
"3") pico ; break ;;
"4") echo "Wyjscie" ; exit ;;
*) continue ;;
esac
done

Skrypt WYBIERZ EDYTOR wersja korzystająca z instrukcji select case oraz działająca w pętli while


#!/bin/bash
while [ 1 ]
do
select nr in vi mcedit pico wyjscie
do
case $nr in
"vi") vi ; break ;;
"mcedit") mcedit ; break ;;
"pico") pico ; break ;;
"wyjscie") echo "wyjscie" ; exit ;;
*) continue ;;
esac
break
done
done

Pętla until

Pętla until jest odwrotością pętli while. Wykonuje się dopóki warunek jest fałszywy. Składnia:


while warunek_jest_prawdziwy
do
instrukcje
done

czyli:


dopóki warunek_jest_prawdziwy
wykonuj
instrukcje
zakończ

Poniżej przedstawiam prosty skrypt wyświetlający liczby od 1 do 10.


#!/bin/bash

a=1
until [ $a -ge 10 ] # dopoki $a >= 10
do
echo "Biezaca liczba: $a" # wyswietlenie biezacej zmiennej
a=$[a+1] # zwiekszenie licznika o 1
done 



Pętla-for

Pętla for wykonuje to samo działanie dla wielu liczb, wyrazów, plików itp. Istnieją dwie wersje pętli for. Pierwsza jest bardzo podobna do tej spotykanej w innych językach programowania: Składnia:


for (( zmienna = 0 ; zmienna <= 5; zmienna++ )) # Wykonuj petle liczac od 0 do 5
do # wykonaj
... # jakieś instrukcje
done # koniec pętli

Wyświetlenie liczb 1-5:


#!/bin/bash

for (( i = 0 ; i <= 5; i++ ))
do
echo "Witam $i raz"
done

wyświetli:

Witam 0 raz
Witam 1 raz
Witam 2 raz
Witam 3 raz
Witam 4 raz
Witam 5 raz

Druga wersja jest szczególnie ukierunkowana na działania na plikach Składnia:


for zmienna in lista # dla każdej wartości znajdującej się na liście
do # wykonaj
... # jakieś instrukcje
done # koniec pętli

Wyświetlenie liczb 1-5:


#!/bin/bash
for nr in 1 2 3 4 5
do
echo $nr # wyświetl bieżącą zmienną
done
echo "Petla zakonczona"

Jeśli chcielibyśmu odzielić liczby wynikowe spacjami (a nie znakami nowego wiersza), możemy to zrobić dopisując parametr -n do polecenia echo:


#!/bin/bash
for motor in 1 2 3 4 5
do
echo -n $nr
echo -n " "
done
echo # wyswietlenie znaku nowego wiersza

Zmienne na liście mogą być też łańcuchami: Wyświetlenie marek motocykli


#!/bin/bash
for motor in Honda Yamaha Suzuki Kawasaki Harley
do
echo $motor # wyświetl bieżącą zmienną
done

Jeśli chcielibyśmy odzielić spacją wyniki, można to zrobić tak jak poniżej. Wyświetlenie plików znajdujących się w bieżącym katalogu przy pomocy pętli for


#!/bin/bash
for plik in * # gwiazdka oznacza wszystkie pliki w bieżącym katalogu
# mozna zapisać dowolną inną ścieżkę
do
echo $plik
done

Wyświetlenie plików znajdujących się w /etc/* przy pomocy pętli for


#!/bin/bash
for plik in /etc/*
do
echo $plik
done

Skrypt zmienia prawa dostępu plikow z rozszerzeniem *.exe znajdujących się w bieżącym katalogu przy pomocy pętli for


#!/bin/bash
for plik in *.exe
do
echo -e "Zmieniam prawa dostępu do pliku\t $plik"
chmod 755 $plik
done

Za pomocą pętli for możemy dokonać dowolnej operacji na każdym z plików: Skrypt łączący w jedną całość pliki *.txt w bieżącym katalogu


#!/bin/bash
for plik in `ls *.txt` # lub $(ls *.txt)
do
cat $plik >> calosc.txt
done

Wyświetlenie plików z podaniem kryteriów wyszukiwania przy pomocy pętli for


#!/bin/bash
echo "Podaj sciezkę dostępu do katalogu(np. /etc)"
read sciezka
echo "Kryteria wyswietlania(np. *, [ao]la itp.)"
read kryteria
for plik in $sciezka/$kryteria
do
echo $plik
liczba_plikow=$[ liczba_plikow+ 1] # zliczanie wyświetlonych plików
done

echo
echo "Liczba wyświetlonych plików: $liczba_plikow"

Skrypt łączący w jedną całość pliki *.txt w bieżącym katalogu wersja rozszerzona


#!/bin/bash

# jesli istnieje plik calosc.txt zapytaj co robic
if [ -f calosc.txt ]; then
echo "Plik calosc.txt juz istnieje. Usunac jego zawartosc? (T/N)"
while [ 1 ]
do
read usun
if [ "$usun" = "T" ] || [ "$usun" = "t" ] ;then
rm calosc.txt
break
elif [ "$usun" = "N" ] || [ "$usun" = "n" ] ;then
break # przejdz dalej (czyli dopisze do pliku)
else
echo "Nieprawidlowy wybor. Wcisnij T lub N."
continue # wybierz ponownie
fi
done
fi

ilosc=0

for plik in `ls *.txt` # lub $(ls *.txt)
do
# jesli wlasnie przetawarzany plik to plik wynikowy
# bo tez ma rozszerzenie *.txt a wiec program bierze go pod uwage,
# opusc go (przejdz do nastepnego pliku w petli)
# inaczej dodalby zawartosc pliku wynikowego do jego samego

if [ "$plik" = "calosc.txt" ];then continue; fi

echo -e "\nNazwa pliku: $plik" >> calosc.txt # dodanie nazwy pliku
echo -e "----zawartosc-------\n" >> calosc.txt
cat $plik >> calosc.txt
let ilosc=ilosc+1 # licznik plikow
done

echo -e "\nDodano zawartosc $ilosc plikow\n"

echo -n "Wyswietlic wynikowy plik? (T) "
read pokaz
if [ "$pokaz" = "T" ] || [ "$pokaz" = "t" ]
then
echo -e "\nZawartosc pliku calosc.txt:\n"
cat calosc.txt
fi 

Parametry

Wywołując skrypt można przekazać parametry np.


dodaj_liczby 2 3

Zmienne używane w skryptach wykorzystujących parametry $0 nazwa wywołanego skryptu $1 pierwszy parametr ..... $9 dziewiąty parametr $@ lista wszystkich parametrów $* wszystkie parametry złączone w jeden łańcuch znaków $# liczba parametrów - napis pusty $? stan ostatnio wykonanego polecenia (0 - poprawnie, nie 0 - błędnie) $$ numer procesu aktualnie wykonywanej powłoki $! numer procesu ostatnnio wykonywanego w tle Przy wywołaniu skryptu: nagrywaj 4 cd-rw obraz.iso kolejne parametry będą wynosiły: $0 = nagrywaj $1 = 4 $2 = cd-rw $3 = obraz.iso $# = 3 $@ = 4 cd-rw obraz.iso Prosty skrypt z wykorzystaniem powyższych informacji


#!/bin/bash
echo "Uruchomiono skrypt o nazwie $0"
echo "Pierwszy parametr to $1"
echo "Drugi parametr to $2"
echo "Trzeci parametr to $3"
echo "Liczba parametrow: $#
echo "Wszystkie parametry wywolania: $@"

Sprawdzenie czy użytkownik podał co najmniej dwa parametry przy wywoływaniu skryptu:


#!/bin/bash
if [ $# -lt 2 ]
then
echo "Podałeś za mało paramerów"
else
echo "OK"
fi

Sprawdzenie czy dwa wyrazy podane jako argumenty wywołania są równe:


#!/bin/bash

if [ $1 = $2 ]
then
echo "wyrazy są rowne"
else
echo "wyrazy są rozne"
fi

Sprawdzenie która liczba jest większa


#!/bin/bash

if [ $1 -gt $2 ]
then
echo "pierwsza liczba jest większa"
elif [ $1 -le $2 ]
echo "druga liczba jest wieksza"
else
echo "liczby są równe"
fi

Skrypt dodaje dwie liczby podane jako parametry


#!/bin/bash

wynik = `expr $1 + $2`
echo "$wynik"

Skrypt zamienia nazwy plików w bieżącym katalogu na liczby 1..n


#!/bin/bash

for i in *
do
mv $i $numer
numer=$[ numer + 1 ]
done
echo "Zmienionych plików: $numer"

Skrypt tworzący katalogi, których nazwy podajemy jako parametry


#!/bin/bash

# Jesli brak parametrów wyjdź
if [ $# -eq 0 ]
then
echo "Nie podano parametów"
exit
fi

for i in $@ # dla każdego parametru
do

# informuje jeśli katalog podany jako parametr istnieje

if [ -d $i ]
then
echo "Katalog $i juz istnieje"

else
# jesli nie istnieje tworzy go
mkdir $i
echo "Utworzono katalog $i"
fi

# ustawienie praw dostępu utworzonym katalogom na drwxr-x--x

chmod 751 $i

done

Skrypt sortuje alfabetycznie parametry #!/bin/bash for i in $@ do echo $i >> /tmp/sortuj.tmp done echo `sort /tmp/sortuj.tmp` rm -f /tmp/sortuj.tmp

Wyświetla tyle gwiazdek ile podano jako parametr


#!/bin/bash

i=1
while [ $i -le $1 ]
do
echo -n '*'
i=$[i+1]
done

echo $i

Program oblicza sumę kolejnych liczb naturalnych w zakresie ograniczonym parametrami


#!/bin/bash

max=$1
suma=$1

while [ 1 ]
do
max=$[ max + 1 ]
suma=$[ suma + max ]

if [ $max -eq $2 ]
then
break
fi
done

echo "Suma liczb naturalnych w zakresie $1 - $2 wynosi $suma"

Parametry specjalne


Numer procesu ostatnio uruchomionego programu można odczytać następująco:

[mariusz@unix mariusz]$ mozilla &
[1] 3563
[mariusz@unix mariusz]$ echo $!
3563

Odczytując zmienną $? sprawdzamy czy program zakończył się bez błędów:


cd nie_ma

bash: cd: nie_ma: Nie ma takiego pliku ani katalogu

echo $?

1

cd /
echo $?

0

Powłoka zwraca 1 gdy wystąpił błąd, 0 gdy wszystko przebiegło pomyślnie. Skrypt podaje liczbę słów, linii i bajtów w pliku podanym jako parametr


#!/bin/bash

if [ ! $# -eq 1 ] # jesli liczba paramerow rozna od 1 - wyjdz
then
echo "Nieprawidlowa liczba parametrow"
exit
elif [ ! -e $1 ] # jezeli plik podany jako parametr nie istnieje - wyjdz
then
echo "Plik podany jako parametr nie istnieje"
exit
elif [ ! -r $1 ] # jeśli pliku nie mozna czytac, wyjdz
then
echo "Nie masz uprawnien do czytania tego pliku"
exit
fi

slowa=`wc -w $1 | awk '{print $1}'`
linie=`wc -l $1 | awk '{print $1}'`
bajty=`wc -c $1 | awk '{print $1}'`

echo "Informacje o pliku $1:"
echo
echo "Liczba slow: $slowa"
echo "Liczba linii: $linie"
echo "Liczba bajtow: $bajty"

Polecenia "| awk '{print $1}'`" dodane są tylko po to aby skrypt nie wyświetlał nazwy pliku po każdym komunikacie programu wc. Bez tego wyniki wyglądałyby następująco: Liczba slow: 15 plik Skrypt uruchamia podane polecenie i informuje czy zakonczyło sie powodzeniem czy porazka (przykladowe polecenie: skrypt rm plik)


#!/bin/bash

# $@ - wszystkie parametry
# &> - stdout i stderr przekierowane na urzadzenie puste
# (brak jakichkolwiek komunikatow)

$@ &> /dev/null


# jesli kod ostatniego polecenia = 0 to znaczy ze wykonano poprawnie

if [ $? -eq 0 ]
then
echo "Polecenie wykonano poprawnie"
else
echo "Wystapil blad"
fi 


Funkcje

Funkcje są 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. Przykład skryptu z funkcjami:


#!/bin/bash

# deklaracja funkcji
function powitanie
{
           echo "Witaj !"
}

# wywołanie funkcji
powitanie

Po uruchomieniu skryptu zobaczymy napis "Witaj !". Funkcję możemy wywołać dowolną ilość razy


#!/bin/bash

function powitanie
{
           echo "Witaj !"
}

powitanie
powitanie

oraz z dowolnej instrukcji/pętli


#!/bin/bash

function wyswietl
{
           ls -l
}

function zakonczenie
{            exit
}
echo "Co chcesz wykonać?"
select opcja in WYSWIETLIC_PLIKI ZAKONCZYC
do
           case $opcja in                       WYSWIETLIC_PLIKI) wyswietl ;;
                      ZAKONCZYC) zakonczenie;;
           esac
break
done

Programujący wcześniej w innych językach pewnie zastanawiają się jak przekazać parametry do funkcji. Oczywiście że tak. Robi się to następująco: #!/bin/bash function param { echo -n "Oto pierwszy parametr: " echo $1 echo -n "A to drugi: " echo $2 } param dlugosc 23 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 $?.


dodaj()
{
wynik=`expr $1 + $2`
return $wynik
}

dodaj 1 2

echo "Wynikiem dodawania jest $?" 




Przetwarzanie tekstu za pomocą AWK

WK jest to język wyszukiwania wzorców oraz przetwarzania tekstów. Wygląda to następująco: awk '{przetwarzanie}' Przydaje sie, kiedy chcemy wypisać tylko określone wiersze lub kolumny z pliku lub czytane z wyjścia jakiegoś polecenia. AWK przetwarza plik wiersz po wierszu, zapisując dany wiersz i poszczególne kolumny w zmiennych. Brzmi to trochę skomplikowanie ale nie należy się przejmować - w rzeczywistości jest to bardzo proste. Już podaje przykład: Przypuśćmy że posiadamy plik Telefony z numerami telefonów w formacie: Mariusz 233-34-35 Włocławek Ania 223-22-33 Sopot i chcemy wyświetlić tylko imiona i numery telefonów (miasto nas nie interesuje) to robimy następująco:


cat Telefony | awk'{print $1, $2}'

lub


awk'{print $1, $2}' < Telefony

Oba polecenia dają identyczne wyniki, pierwsze przekazuje (potokiem) plik wyświetlony poleceniem cat, drugie pobiera dane bezpośrednio z pliku. Ne ekranie zobaczymy oczywiście:


Mariusz 233-34-35
Ania 223-22-33

Zatem wiadomo już że kolejne kolumny przechowywane są w zmiennych opatrzonych kolejnymi liczbami. Dokładnie tak jak poniżej. $1 - pierwsza kolumna $2 - druga kolumna $3 - trzecia kolumna .... $n - n-ta kolumna $0 oznacza cały wiersz W naszym przypadku będzie to wyglądało następująco:


$1="Mariusz"         $2="233-34-35"

a następnie:


$1="Ania"         $2="223-22-33 "

Oczywiście w zmiennej $0 będzie siedział cały pierwszy wiersz:


$0="Mariusz 233-34-35"

później


$0="Ania 223-22-33"

i tak w kółko aż do końca pliku - wygodne prawda? Co zrobić jeśli chcemy zachować nasze wyniki w drugim pliku? Oczywiście użyjemy znanego nam przekierowania > Robimy to następująco:


cat Telefony | awk'{print $1, $2}' > Tel_bez_miast

lub


awk'{print $1, $2}' < Telefony > Tel_bez_miast

Teraz pokażę jak postępować z danymi pochodzącymi z poleceń wydawanych bezpośrednio z konsoli, chyba najpopularniejszą komendą jest ls. Użyje jej z parametrem -l aby dostać dużo informacji. Będziemy mogli sami zdecydować które kolumny mają być wyświetlone. :) Przykładowy wydruk polecenia ls -l:


drwxrwxr-x 2 mariusz mariusz 1024 mar 31 20:48 Praca
-rw-r--r-- 1 mariusz mariusz 34304 mar 23 18:56 ~z_sieci

Przypuśćmy że chcemy wypisać tylko kolumny 1 oraz 9, czyli prawa dostępu do pliku oraz plik/katalog. Wystarczy do tego instrukcja:


ls -l | awk '{print $1,$9}'

Teraz nasz wydruk wygląda następująco:


drwxrwxr-x Praca
-rw-r--r-- ~z_sieci

Nic nie staje na przeszkodzie aby wyświetlić kolumny w odwrotnej kolejności:


ls -l | awk '{print $9,$1}'

Wynik:


Praca drwxrwxr-x
~z_sieci -rw-r--r--

Mając plik z danymi pracownika w formacie: Imie Nazwisko Stanowisko Tel. domowy Miasto Jan Kowalski Kierownik 233-22-21 Włocławek Elwira Lewandowska Sekretarka 241-13-13 Toruń Antoni Kwiatkowski Dyrektor 413-14-55 Włocławek chcąc wypisać odpowiednio kolumny: Nazwisko, Imię, Tel. domowy, piszemy:


cat dane | awk '{print $2, $1, $4}'

Może zdarzyć się że separatorem kolumn będzie znak dwukropka: Jan:Kowalski:Kierownik:233-22-21:Włocławek Wtedy używamy parametru -Fseparator, w tym przypadku będzie to miało postać:


cat dane | awk -F: '{print $2, $1, $4}'

Jeśli życzymy sobie, aby kolumny na wyjściu były rozdzielone znakami tabulacji, albo dowolnym łancuchem możemy napisać:


cat dane | awk -F: '{print "Pierwsza kolumna: " $2,"druga:" $1,"trzecia:\t" $4}'

Wzorce z wyrażeniem regularnym Przypuśćmy że chcemy wyświetlić wiersze zawierające wyraz TELEFON z pliku prywatne.txt:


awk '/TELEFON/' prywatne.txt

Możemy tutaj używać wszelkich wyrażeń regularnych jakie nam pzyjdą do głowy np:


awk '/TEL*/' prywatne.txt

awk '/^TELEFON/' prywatne.txt

awk '/[ao]la/' prywatne.txt

itp. Pisałem o całych wierszach, jednak nic nie stoi na przeszkodzie aby sprawdzać poszczególne kolumny. np polecenie ls -l wyświetla m.in. właściciela pliku oraz grupę do której należy:


drwxr-xr-x 2 root mariusz 1024 maj 9 19:13 publ.txt.txt
drwxr-xr-x 2 mariusz root 1024 maj 9 19:13 rower
-rwxrwxr-x 1 mariusz mariusz 45 kwi 9 22:08 rozmiar.txt

Nas interesuje tylko właściciel a więc piszemy:


ls -l | awk '$3 == "mariusz"'

Jeśli warunek spełniony, wiersz jest drukowany:


drwxr-xr-x 2 mariusz root 1024 maj 9 19:13 rower
-rwxrwxr-x 1 mariusz mariusz 45 kwi 9 22:08 rozmiar.txt

Utworzenie tabeli html z zawartości pliku. Plik ma dowolną ilość wierszy i jest w formacie: a b c d e f Plik rozdzielamy na kolumny:


cat a | awk '{print $1,$2,$3}'

dodajemy instrukcje html'a (w cudzysłowach): echo " < table border=1> " > tab.html cat a | awk '{print ""$1"", ""$2"", ""$2""}>> tab.html echo "">> tab.html Dobra wiadomość: W AWK możemy dodać informacje, które mają się pojawić przed przetworzeniem pierwszego wiersza pliku (BEGIN), jak również po przetworzeniu ostatniego wiersza pliku (END): Konstrukcja jest następująca:


awk 'BEGIN{nagłówek} {właściwe przetwarzanie} END{zakończenie}'

Po wykonaniu następujących instrukcji:


cat a | awk 'BEGIN{print ""}{print "","",""} END{print "
"$1""$2""$3"
"}' >tab.html w pliku tab.html pojawi się tekst:
ab c
d e f

Okna dialogowe

Do tej pory do pobierania i wyświetlania informacji używaliśmy poleceń read i echo. Okazuje się, że można dokonać tego w efektowniejszy wizualnie sposób. Czyż nie przyjemnie było by oglądać różne komunikaty tak jak na screenie poniżej?

Prawda że ładne? Do tego robienie takich okienek jest bardzo proste. Wystarczy poniższa instrukcja:


dialog --msgbox "Witaj Uzytkowniku. \n\nNacisnij OK aby kontynuowac." 7 40

Oznaczenia:


dialog - wywołanie programu dialog.

-- msgbox - wybranie okna MessageBox służącego do wyświetlania informacji. znaki \n\n to znane nam już przejście do nowego wiersza 7 40 to kolejno: wysokość i szerokość okna dialogowego. Jeśli nie mamy czasu kombinować możemy wpisać 0 0 i wtedy okno samo dopasuje się do tekstu (Jednak to nie zawsze działa prawidłowo). Możemy również dodać tytuł pojawiający się na pasku tytułowym poprzez dodanie parametru --title:


dialog --title "Okno z wiadomoscia" --msgbox "\nWitaj Uzytkowniku. \n\nNacisnij OK aby kontynuowac." 7 40

Napis "Powitanie" znajdujący się w tle na górze ekranu możemy wstawić używając opcji --backtitle:


dialog --title "Okno z wiadomoscia" --backtitle "Powitanie" --msgbox "\nWitaj Uzytkowniku. \n\nNacisnij OK aby kontynuowac." 9 40

Opcja --clear czyści okno po zamkonczeniu:


dialog --clear --msgbox "Witaj Uzytkowniku. \n\nNacisnij OK aby kontynuowac." 7 40

--Infobox Jeśli nie potrzebujemy potwerdzania przyciskiem OK stosujemy ono informacyjne infobox Składnia jest taka sama jak przy MsgBox'ie: --infobox


dialog --title "Okno info" --infobox "Informacja" 6 30

Lista wyboru okien dialogowych (wyświetlana poleceniem: dialog) --calendar --checklist ... --fselect --gauge [] --infobox --inputbox [] --menu

... --msgbox --passwordbox [] --radiolist ... --checklist ... --tailbox --tailboxbg --textbox --timebox --yesno Wyświetlanie zawartości plików --textbox Opcja --textbox wyświetla zawartość pliku. Składnia: --textbox Spróbujemy wyświetlić plik zawierający kalendarz na bieżący miesiąc. Najpierw tworzymy plik z kalendarzem.


cal > cal.txt

następnie wydajemy polecenie wyświetlające plik tekstowy:


dialog --title "Oto kalendarz" --textbox "cal.txt" 0 0

Okno samo dopasuje się do rozmiaru kalendarza. Kalendarz czyli --calendar dialog posiada nawet wbudowaną opcję --calendar, która wyświetla zaznaczony dzień miesiąca, oraz pozwala wybrać strzałkami (i zatwierdzić) dowolną datę. Data ta zostanie zapisana w pliku określonym na końcu polecenia. Składnia: --calendar Przy wywołaniu należy podać dokładną datę. :


dialog --calendar " Kalendarz" 0 0 01 1 1991 2>data.txt

Pomiędzy poszczególnymi kolumnami przechodzimy używając bocznych klawiszy kursora, natomiast dni, miesiące oraz lata wybieramy strzałkami: góra, dół. Po zatwierdzeniu w pliku data.txt znajdzie się ciąg 01/01/1991. InputBox czyli wprowadzanie danych Okno InputBoxa można porównać do okienka formularza na stronie www. Tak samo umożliwia wpisywanie i zatwierdzanie tekstu. Składnia: --inputbox [] Zbudujemy sobie okienko do wpisania Imienia:


dialog --title "Wprowadzanie danych" --inputbox "Podaj swoje imie" 8 40

Wszytsko ok, wpisuje ale gdzie są zapisywane dane? Otórz na końcu polecenia musimy dodać jeszcze przekierowanie do pliku wyjściowego:


dialog --title "Wprowadzanie danych" --inputbox "Podaj swoje imie" 8 40 2> imiona.txt

teraz zaglądając do pliku imiona.txt zobaczymy imię które wpisaliśmy w formularzu:


echo "Wpisales `cat imiona.txt' "

Inputbox pozwala wprowadzić wartość domyślną do okna. Dopisuje się ją po podaniu wymiarów:


dialog --title "Wprowadzanie danych" --inputbox "Podaj swoje imie" 8 40 "Ania" 2> imiona.txt

Wprowadzanie haseł: --passwordbox Okno passwordbox jak się pewnie domyślacie jest to okienko do wpisywania hasła. Wygląda tak samo jak inputbox, jednak to co wpisujemy jest niewidoczne. Składnia: --passwordbox []


dialog --title "Wprowadzanie hasla" --passwordbox "Podaj hasło" 8 40 2> haslo.txt

Wartość domyślną wprowadza się tak samo jak w InputBoxie czyli:


dialog --title "Wprowadzanie hasla" --passwordbox "Podaj hasło" 8 40 "Tajne" 2> haslo.txt

--YesNo Jak nazwa wskazuje okno pozwoli nam wybrać przycisk TAK lub NIE. Składnia: --yesno


dialog --yesno "Czy dialog jest OK?" 8 30

Nasz wybór kryje się w zmiennej $?. Po wybraniu opcji TAK kodem wyjścia będzie 0, wybranie opcji NIE wprowadzi do zmiennej kod 1 a wciśnięcie przycisku Escape da nam kod równy 255. Kod wyjścia wyświetlimy następująco:


echo $?

Przykładowy skrypt korzystający z --yesno wygląda następująco:


#!/bin/bash

dialog --yesno "Czy wyswietlic pliki z biezacego katalogu?" 8 40 wybor=$? case $wybor in "0" ) ls ;; "1") echo "Wybrales NIE" ;; "255") echo "Wcisnales Escape" ;; esac Menu wyboru: --menu --menu ... Dzięki menu zbudujemy sobie prostą ankietę:


dialog --menu "Jakiego systemu używasz?" 10 30 3 1 Windows 2 Linux 3 Inny 2> system.txt

W pliku system.txt znajdzie się numer odpowiedzi którą wybraliśmy, czyli przy wyborze Linuksa polecenie: cat system.txt wyświetli: 2. Lista opcji --checklist Lista opcji CheckList pozwala wybrać kilka opcji naraz za pomocą stawianych krzyżyków: Składnia: --checklist ...


dialog --checklist "Jakiego systemu używasz?" 10 30 3 1 Windows on 2 Linux off 3 Inny off 2> system.txt

Windows on - oznacza że opcja Windows będzie domyślnie zaznaczona krzyżykiem, natomiast Linux oraz Inny mają trybut off więc będą wyświetlane bez zaznaczenia.

Po wybraniu Windowsa oraz Linuksa w pliku system.txt znajdzie się ciąg: "1" "2". Dodatkowa opcja --separate-output produkuje wyjście w osobnych liniach, bez cytowania. Ułatwia to przetwarzanie przez inny program. Lista opcji --radiolist Lista opcji RadioList pozwala wybrać tylko jedną opcję. Składnia: --radiolist ...


dialog --radiolist "Jakiego systemu używasz?" 10 30 3 1 Windows off 2 Linux off 3 Inny off 2> system.txt

Tu również możemy dać domyślny wybór ustawiając parametr status na on (jednak musimy pamiętać żeby reszta była ustawiona na off)


dialog --radiolist "Jakiego systemu używasz?" 10 30 3 1 Windows off 2 Linux on 3 Inny off 2> system.txt

Po wybraniu Linuksa, w pliku system.txt znajdzie się liczba 2. fselect Opcja fselect pomaga wybrać określony plik w drzewie katalogów. Katalog i plik wybieramy strzałkami i spacją lub bezpośrednio wpisując scieżkę w dolnej części okna, jednocześnie obserwując zawartości katalogów przez które przechodzimy. Składnia: --fselect Przykład:


dialog --fselect /win2/bash/ 10 40 2>sciezka.txt

Po kilku "podróżach" po katalogach zatwierdziłem sciezkę: /home/mariusz/Desktop/index.html i właśnie ona znalazła się w pliku sciezka.txt. --gauge czyli pasek postępu Opcja --gauge buduje na dole ekranu pasek postępu. Dane bierze ze standardowego wejścia. Składnia: --gauge [ ] Pasek postępu potrzebuje stale dopływających danych więc jeśli napiszemy tylko:


dialog --gauge "Postep" 8 40

to program będzie oczekiwał na nie w nieskończoność i będziemy mmusieli przerwać jego działanie klawiszami CTRL+C. Przykład: Mamy skrypt o nazwie postep.sh, który generuje liczby od 0 do 100:


#!/bin/bash

licznik=0
while [ $licznik -lt 100 ]
do
licznik=$[licznik+1 ]
echo $licznik
done

Teraz uruchamiamy nasz skrypt przepuszczając wyniki przez dialog --gauge:


bash postep.sh | dialog --gauge "Postep" 8 40



Oczywiście moglibyśmy również wpisać dialog bezpośrednio do pliku:


#!/bin/bash

licznik=0
while [ $licznik -lt 100 ]
do
licznik=$[ licznik+1 ]
echo $licznik | dialog --gauge "Postep" 8 40
done

--timebox Opcja --timebox służy do ustawiania godziny. Składnia jest następująca: --timebox Przykład:


dialog --clear --timebox "Ustaw zegar" 3 8 23 01 59 2> godz.txt

Sterowanie: bocznymi strzałkami wybieramy komórkę, natomiast godzinę ustawiamy wciskając góra/dół.