SYSTEMY OPERACYJNE M E N U Ogłoszenia Plan_laboratoriów Laboratorium_1 Laboratorium_2 Laboratorium_3 Laboratorium_4 Laboratorium_5 Laboratorium_6 Kol_1_n_03_04 Kol_1_imn_03_04 Kol_konkurs1 Giełda_zadań Laboratorium_8 Laboratorium_9 Laboratorium_10 Linki Laboratorium_6 skrypty BASH - zadania wprowadzające: 1. Ostatnia aktualizacja: 2005-03-30 11:08:17 Podaj przykład skryptu wykorzystującego zmienne śrowiskowe, zmienne programowe i odwrotne apostrofy (Użyj $USER, $PWD, $HOME.). echo "Czesc $USER" echo "twoj aktualny katalog to $PWD" zmienna="a to twoj katalog mowy to $HOME" echo $zmienna echo "nazwa twojego hosta to: $HOSTNAME" echo "korzystasz z systemu operacyjnego: $OSTYPE" zmienna2=`pwd` echo ""Odwrotny cudzyslow" - przyklad: $zmienna2" 2. #zero oznacza sukces Podaj przykład skryptu wykorzystującego zmienne specjalne. (Użyj $0, $1, $2,..., $9, $@, $*, $?, $$.) echo "Nazwa biezacego skryptu: $0" echo "Pierwszy przekazany parametr skryptu: $1" echo "Drugi przekazany parametr skryptu: $2" echo "..." echo "Dziewiaty przekazany parametr skryptu: $9" #separatorem będzie spacja echo "Skrypt uruchomiono z parametrami: $@" #separator okresla zmienna $IFS echo "Skrypt uruchomiono z parametrami: $*" echo "Kod powrotu ostanio wykonywanego polecenia: $?" echo "PID procesu biezacej powloki: $$" 3. Podać przykład skryptu używającego tablice (Użyj declare, unset, *, @, # ). owoc[0]="jablko" owoc[1]="gruszka" owoc[2]="sliwka" owoc[3]="wisnia" echo "Pierwszy element tablicy owoc to: ${owoc[0]}" echo "Wszystkie elementy tablicy owoc to: ${owoc[*]}" echo "Wszystkie elementy tablicy owoc to: ${owoc[@]}" echo "Drugi element tablicy owoc ma ${#owoc[1]} znakow" echo "Tablica owoc ma ${#owoc[*]} elementy" imie=(jola Ania Kasia Basia Magda) echo "Wszystkie elementy tablicy imie to: ${imie[@]}" unset imie #usuniecie tablicy echo "Tablica imie ma ${#imie[*]} elementow" tab1=(`cat /etc/passwd`) echo "Tablica tab1 ma ${#tab1[*]} elementow" declare tab2=(`cat /etc/passwd`) echo "Tablica tab2 ma ${#tab2[*]} elementow"
4. 5. 6. Napisać skrypt obliczający sumę, różnicę i iloczyn dwóch wczytanych liczb całkowitych. (Użyj polecenia read.) echo -n "Podaj pierwsza liczbe: " read l1 echo -n "Podaj druga liczbe: " read l2 echo suma=$[l1 + l2] #1 sposob echo "Suma liczb wynosi: $suma" roznica=$((l1 -l2)) #2 sposob echo "Roznica liczb wynosi: $roznica" let iloczyn=l1*l2 #3 sposob echo "Iloczyn liczb wynosi: $iloczyn" iloraz=$[l1 / l2] echo "Iloraz liczb wynosi: $iloraz" #czesc calkowita modulo=$[l1 % l2] echo "Modulo liczb wynosi: $modulo" #reszta Napisać skrypt sprawdzający, czy w katalogu głównym użytkownika istnieje plik.bashrc. (Użyj instrukcji warunkowej if.) #Warunki dla pliku: #-d plik, plik jest katalogiem #-e plik, plik istnieje #-f plik, plik jest plikiem regularnym #-g plik, plik ma przypisany set-gropu-id #-r plik, plik daje się odczytac #-s plik, plik ma niezerowy rozmiar #-u plik, plik ma przypisany set-user-id #-w plik, plik można edytowac (można pisac)) #-x plik, plik wykonywalny if [ -e ~/.bashrc ] #powyzsze jest rownowazne: if test -e ~/.bashrc echo "Masz plik.bashrc" echo "Nie masz pliku.bashrc" Napisać skrypt pytający się czy jest wieczór. Dla odpowiedzi 'tak' powinien wypisać 'Dobry wieczor', dla odpowiedzi 'nie' - 'Dzien bry', dla pozostałych odpowiedzi 'Nie rozpoznana odpowiedz: ' i przytoczyć treść odpowiedzi. (Użyj instrukcji warunkowej if-elif.) #Porownywanie ciagow: #ciag, ciag jest niepusty #ciag1=ciag2, ciagi sa jednakowe #ciag1!=ciag2, ciagi nie sa rowne #-n ciag, ciag nie jest NULL #-z ciag, ciag jest NULL (pusty) echo -n "Czy jest wieczor? Odpowiedz tak lub nie: " read poradnia if [ "$poradnia" = "tak" ] echo "Dobry wieczor" elif [ "$poradnia" = "nie" ] echo "Dzien bry" echo "Nie rozpoznana odpowiedz: $poradnia"
7. 8. 9. 10. 11. Napisać skrypt pobierający numer dnia tygodnia i wypisujący jego nazwę lub informację "Nic nie wybrałeś". (Użyj polecenia read i instrukcji warunkowej case.) echo "Podaj numer dnia tygodnia: " read dzien case "$dzien" in "1") echo "Poniedzialek" ;; "2") echo "Wtorek" ;; "3") echo "Sroda" ;; "4") echo "Czwartek" ;; "5") echo "Piatek" ;; "6") echo "Sobota" ;; "7") echo "Niedziela" ;; *) echo "Nic nie wybrales" esac Wyświetlić z bieżącego katalogu nazwy wszystkich plików: *.html, *.htm, *.php, *.css, *.gif, *.jpg. (Użyj pętli for.) for nazwa in *.html *.htm *.php *.css *.gif *.jpg echo $nazwa Napisać skrypt wykonujący pętlę 15 razy i wypisujący za każdym razem numer obiegu pętli. (Użyj pętli while.) #Operatory wykorzystywane w warunkach (wyr warunek wyr): #-eq (==), -ne (!=), -lt (<), -le (<=), -gt (>), -ge (>=) n=1; #gdy warunek stanie się fałszywy to petla zakonczy dzialanie while [ $n -le 15 ] echo "Petla wykonuje sie po raz: $n" n=$[n + 1] Napisać skrypt sprawdzający, czy użytkownik, którego login został podany jako parametr skryptu zalogował się. (Użyj pętli until.) until who grep "$1" > /dev/null #gdy warunek stanie się prawdziwy to petla zakonczy dzialanie sleep 60 echo -e a echo "$1 wlasnie sie zalogowal!!! " Napisać skrypt pytający się użytkownika co wybiera: kawe, herbate, sok, quit. Po wybraniu kawy, herbaty lub soku powinna pojawić się informacja co zostało wybrane. Po wybraniu quit skrypt powinien zakończyć działanie. (Użyj pętli select i instrukcji warunkowej case.) echo "Co wybierasz?" select x in kawe herbate sok quit
case $x in "kawe") echo "Wybrales kawe." ;; "herbate") echo "Wybrales herbate." ;; "sok") echo "Wybrales sok." ;; "quit") echo "Wybrales quit."; break ;; *) echo "Nic nie wybrales." esac 12. Zmienić nazwy plików i katalogów pisane dużymi literami na nazwy pisane małymi literami. 13. for nazwa in * mv $nazwa `echo $nazwa tr '[A-Z]' '[a-z]'` Napisać funkcję sprawdzają, czy dany rok jest rokiem przestępnym. Następnie napisać skrypt, który dla wolnej ilości argumentów sprawdza, czy rok podany jako argument jest rokiem przestępnym. function przestepny() { rok=$1 let t=$rok%4 let s=$rok%100 let z=$rok%400 if [$z -eg 0 -o $t -eq 0 -a $s -ne 0 ] ; return 0 return 1 } for i in $*; if przestepny $i ; echo " $rok: rok przestepny" echo "$rok: rok nieprzestepny" Karolina Wojcik ++ Zadania - skrypty 1. Napisać skrypt, który będzie działał jak funkcja 'Znajdź i Zamień'. Skrypt powinien modykować wszystkie pliki o zadanym rozszerzeniu znajdując szukany wzorzec i zamieniając go na inny wzorzec. PLIKI="*.htm" WZORZEC1="H1"; WZORZEC2="H2"; for plik in `nd. -path "$PLIKI"` echo $plik sed "s/$wzorzec1/$wzorzec2/g" $plik > wynik.tmp mv wynik.tmp $plik ; rm wynik.tmp 2. Napisać skrypt obliczający sumę wczytanych liczb aż napotkania zera. SUMA=0
echo "Wpisz liczby calkowite (0 to koniec):" while true ; read LICZBA SUMA=$[$SUMA+$LICZBA] if [ $LICZBA = "0" ] ; break echo "Suma wczytanych liczb wynosi: $SUMA" --------------------------------------------------------- n=0 l=1 while [$l -ne0] read l n=$[l+n] echo suma:$n Magdalena Wiesner ++ 3. Napisać skrypt obliczający silnię z liczby naturalnej podanej jako parametr skryptu. 4. if [ $# -eq 0 ] echo "Prawidlowe wywolanie skryptu: $0 liczba_naturalna" silnia=1 for (( i=1; i<=$1; i++ )) silnia=`expr $silnia * $i` echo "Silnia z liczby $1 = $silnia" ---------------------------------------------------- n=1 i=1 if [ $1 -lt 0] echo "Liczba < 0!" while [$i -le $1] n=$[n*$i] i=$[i+1] echo "$n" #Marcin Rutkowski ++ Napisać skrypt pakujący katalog pliku, który w nazwie ma aktualną datę. Nazwa katalogu powinna być przekazana jako parametr skryptu. Skrypt powinien obsługiwać przypadki gdy nie podano parametru i gdy podany parametr nie jest katalogiem. if [ $# -eq 0 ] echo "Prawidlowe wywolanie skryptu: $0 nazwa_katalogu" if [ -d $1 ] tar zcvf `date '+%d-%m-%y'`.tar.gz $1
5. echo "Podany parametr powinien byc katalogiem" -------------------------------------------------------- if [ $1 ] if [ -d $1 ] tar -cvvf 2005-03-23.tar.gz $1/ echo " $1 nie jest katalogiem " echo " nie podano parametru " #Justna Benkowska ++ Napisać skrypt rysujący trójkąt równoramienny z gwiazdek o podstawie podanej przez użytkownika jako parametr skryptu. if [ -z $1 ] echo "Prawidlowe wywolanie skryptu: $0 podstawa_trojkata" liczba=$1 i=1 pom=1 while [ "$i" -le $liczba ] j=$i while [ "$j" -le $liczba ] echo -n "*" j=$(($j+1)) echo "" pomoc=1 while [ "$pomoc" -le $pom ] echo -n " " pomoc=$(($pomoc+1)) pom=$(($pom+1)) i=$(($i+2)) echo "" ----------------------------------------------------------- echo Podaj dlugosc podstawy: read x i=$[x] declare tab[x] declare tab2[x] while [ $x -gt 0 ] tab[x]='*' x=$[x-1] x=$[x-1] j=$[x]
6. 7. 8. 9. while [ $x -gt 0 ] j=0 while [ $j -le $[i-x-1]] tab2[j]='*' j=$[j+1] x=$[x-1] echo "${tab2[*]}" echo "${tab[*]}" Piotr Jarosz Napisać skrypt sprawdzający, czy istnieje podany jako parametr plik i wypisujący odpowiedni komunikat na ekranie. test -e $1 if [ $? -gt 0 ] ; echo plik nie istnieje echo plik istnieje Karolina Wojcik ++ Jak wyżej, jeśli plik istnieje powinien pojawić się napis że plik o podanej nazwie istnieje, w przeciwnym razie plik taki powinien zostać utworzony tak, by jego pierwszą linię stanowił napis "To jest nowy plik". (Bez użycia edytora vi.)!# /bin/bash if [-e $1] echo "Podany plik istnieje" echo "To jest nowy plik" > $1 #Marcin Rutkowski ++ Napisać skrypt kopiujący wszystkie pliki o rozszerzeniu ".txt" podanego jako argument katalogu, jeśli podany katalog nie istnieje należy go najpierw stworzyć. if [-e $1] echo "katalog $1 istnieje" echo "katalog $1 nie istnieje wiec go teorzymy" mkdir $1 cp *.txt $1 Justna Benkowska ++ Napisać skrypt usuwający wszystkie pliki z katalogów "podkatalog1" i "podkatalog2". Przed usunięciem nazwa pliku powinna zostać wypisana na ekranie terminala, datkowo przy usuwaniu powinno pojawić się pytanie o potwierdzenie. rm -i $1/* rm -i $2/* LUKASZ KOMAR + ---------------------------------------------------- #!/bin/sh i=1 while [ $i -le $#] rm -ivr $1/* shift
Paweł Brzeski ++ 10. 11. 12. 13. 14. 15. ----------------------------------------!# /bin/bash rm -i -r $@ LUKASZ KOMAR ++ Napisać skrypt, który jako parametry przyjmuje nazwę pliku, ściężkę katalogu i nową nazwę pliku, pod którą plik będzie pamiętany w katalogu i jego podkatalogach, a następnie powiela plik w tym katalogu i wszystkich jego podkatalogach (1 poziom w głąb), informując o tym użytkownika. W wyniku błędnie podanych parametrów należy wyświetlić informację na ekranie terminala informującą o tym. Napisać skrypt zawierający informacje o każdym podkatalogu znajdującym się w katalogu podanym jako argument, obejmującą nazwę podkatalogu i liczbę znajdujących się w nim plików.!# /bin/bash ls -l $@ LUKASZ KOMAR ++ Sporządzić listę plików, znajdujących się w katalogu mowym, posortowanych malejąco według numerów i-węzłów. (i-węzeł pliku znajduje się w pierwszej kolumnie po wydaniu polecenia "ls -i".) ls -i sort -r Malgorzata Krzyzanowska + Napisać skrypt porównujący zawartość pliku o zadanej jako parametr nazwie ze wszystkimi plikami, których nazwy występują w pliku o nazwie "lista.plikow" Jeśli podana jest nazwa katalogu jako argument, to należy wylistować zawartość katalogu, w przeciwnym wypadku należy zapytać uzytkownika o nazwę katalogu i wylistować podany katalog. KATALOG="$1" if [ -n "KATALOG" -a -d "KATALOG" ] ; ls $KATALOG exit while terue ; echo read -p "podaj katalog:" KATALOG if [ -z "KATALOG" ] ; continue if [ -d KATALOG ] ; ls $KATALOG exit Karolina Wojcik Jak wyzej, w przypadku nacisnięcia litery "q", po wydaniu zapytania należy przerwać wykonanie skryptu. #!/bin/sh if [ -d $1 ] ls -l $1 echo "Podaj nazwe katalogu: " read katalog case "$katalog" in "q" ;;
16. 17. 18. 19. 20. 21. 22. 23. esac if [-d $katalog] ls -l $katalog Piotr Kisieliczyn +++ Jak wyżej, jeśli katalog jest pusty, podać odpowiedni komunikat, datkowo opcjonalnie dać drugi parametr będący liczbą sekund, na którą system wstrzyma wykonanie skryptu. Napisać skrypt sprawdzający, czy któryś z użytkowników o id podany jako parametr wejsciowy jest zalogowany w systemie wiecej niż jeden raz. Dla każdego takiego użytkownika należy wyświetlić jego identykator i listę terminali, na których pracuje. Informacje o kolejnych użytkownikach powinny być oddzielone ciągiem gwiazd. Napisać skrypt zapisujący pliku o nazwie "plik.usr", pełną informację o użytkownikach, którzy mają aktualnie odblokowane przyjmowanie komunikatów na terminal. Napisać skrypt liczący łączną liczbę słów z pierwszych trzech linii plików zaczynających się na "p" lub "k". Napisać skrypt wyświetlający w odwrotnej kolejności argumenty jego wywołania. (np. skrypt a b c d => d c b a) Wysłać za pomocą poczty elektronicznej wszystkich aktualnie zalogowanych użytkowników systemu wiamość zapisaną w pliku wiamość w taki sposób, aby wiamość została wysłana osobno dla każdego użytkownika!/bin/bash adresy='who cut -f1 -d " " sort -n' for ile in $adresy mail $ile -s "Teamt" < wiamosc Piotr Kisieliczyn Napisać skrypt, który dla katalogów podanych jako parametry odnajdzie i wyświetli nazwę najbardziej zagłębionego podkatalogu oraz jego poziom zagłębienia. Skrypt nie może wyświetlać komunikatów o błędach oraz, jeżeli zostanie uruchomiony bez parametrów, powinien wyświetlić stosowną informację i zakończyć działanie. #!bin/bash if [$# -eq 0] echo "Podaj parametry: nazwy katalogow sprawdzenia" exit for katalog in $* nd $katalog - type d 2 >/dev/null awk -F/ '{print $0 ":" NF -1}' sort -t: +1nr head -1 awk -f:'{print $1 "\t" $2}' Magdalena Wiesner Napisz skrypt pracujący w pętli, wyświetlający komunikat "Podaj polecenie: " i pobierający ciąg znaków z klawiatury. Dopuszczalne polecenia to "katalog", "grupa" i "koniec". Polecenia mogą datkowo zawierać argument, będący nazwa użytkownika (jeżeli nazwa nie zostanie podana, skrypt zapyta o nią). W zależności od polecenia, zadaniem skryptu jest wyświetlenie katalogu mowego lub numeru grupy użytkownika. Polecenie "koniec" powoduje zakończenie pracy skryptu. x=1; while [ $x!= 0 ] echo "Podaj polecenie:"
24. read polecenie case $polecenie in esac "katalog") echo "Podaj nazwe uzytkownika:"; read user; echo "Katalog mowy to:"; grep $user /etc/passwd cut -d ':' -f6,6;; "grupa") echo "Podaj nazwe uzytkownika:"; read user; echo "Numer grupy to:"; grep $user /etc/passwd cut -d ':' -f4,4;; "koniec") x=0;; Piotr Jarosz Napisać skrypt sprawdzający czy któryś z użytkowników o identykatorach podanych w argumentach wejściowych nadał grupie lub innym prawa r, w lub x swojego katalogu. Jeśli tak to należy wyświetlić na ekranie i zapisać pliku o nazwie users.right odpowiednie informacje. Jeśli podano błędne parametry skrypt powinien wyświetlić informację o tym jak należy go używać. Copyright by Robert Fidytek.