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_fin_03_04 Kol_1_imn_03_04 Kol_konkurs1 Giełda_zadań Laboratorium_8 Laboratorium_9 Laboratorium_10 LinkiLaboratorium_6
Ostatnia aktualizacja: 2005-03-30 11:08:17skrypty BASH - zadania wprowadzające:
Podaj przykład skryptu wykorzystującego zmienne środowiskowe, zmienne programowe i odwrotne apostrofy (Użyj $USER, $PWD, $HOME.).
#!/bin/bash
echo "Czesc $USER"
echo "twoj aktualny katalog to $PWD"
zmienna="a to twoj katalog domowy to $HOME" echo $zmienna
echo "nazwa twojego hosta to: $HOSTNAME"
echo "korzystasz z systemu operacyjnego: $OSTYPE" zmienna2=`pwd`
echo ""Odwrotny cudzyslow" - przyklad: $zmienna2"
exit 0 #zero oznacza sukces
1.
Podaj przykład skryptu wykorzystującego zmienne specjalne. (Użyj $0, $1, $2, ..., $9, $@, $*, $?, $$.)
#!/bin/bash
echo "Nazwa biezacego skryptu: $0"
echo "Pierwszy przekazany parametr do skryptu: $1" echo "Drugi przekazany parametr do skryptu: $2" echo "..."
echo "Dziewiaty przekazany parametr do 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: $$"
exit 0
2.
Podać przykład skryptu używającego tablice (Użyj declare, unset, *, @, # ).
#!/bin/bash
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"
exit 0
Napisać skrypt obliczający sumę, różnicę i iloczyn dwóch wczytanych liczb całkowitych. (Użyj polecenia read.)
#!/bin/bash
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
exit 0
4.
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
#!/bin/bash
if [ -e ~/.bashrc ]
#powyzsze jest rownowazne: if test -e ~/.bashrc then echo "Masz plik .bashrc"
else echo "Nie masz pliku .bashrc" fi
exit 0
5.
Napisać skrypt pytający się czy jest wieczór. Dla odpowiedzi 'tak' powinien wypisać 'Dobry wieczor', dla odpowiedzi 'nie' - 'Dzien dobry', 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)
#!/bin/bash
echo -n "Czy jest wieczor? Odpowiedz tak lub nie: " read poradnia
if [ "$poradnia" = "tak" ] then echo "Dobry wieczor" elif [ "$poradnia" = "nie" ] then echo "Dzien dobry" else
echo "Nie rozpoznana odpowiedz: $poradnia" exit 1
fi
exit 0
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.)
#!/bin/bash
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
exit 0
7.
Wyświetlić z bieżącego katalogu nazwy wszystkich plików: *.html, *.htm, *.php, *.css, *.gif, *.jpg. (Użyj pętli for.)
#!/bin/bash
for nazwa in *.html *.htm *.php *.css *.gif *.jpg do
echo $nazwa done
exit 0
8.
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 (>=)
#!/bin/bash
n=1;
#gdy warunek stanie się fałszywy to petla zakonczy dzialanie while [ $n -le 15 ]
do
echo "Petla wykonuje sie po raz: $n" n=$[n + 1]
done
exit 0
9.
Napisać skrypt sprawdzający, czy użytkownik, którego login został podany jako parametr skryptu zalogował się. (Użyj pętli until.)
#!/bin/bash
until who | grep "$1" > /dev/null
#gdy warunek stanie się prawdziwy to petla zakonczy dzialanie do
sleep 60 done
echo -e a
echo "$1 wlasnie sie zalogowal !!! "
exit 0
10.
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.)
#!/bin/bash
echo "Co wybierasz?"
select x in kawe herbate sok quit do
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 done
exit 0
Zmienić nazwy plików i katalogów pisane dużymi literami na nazwy pisane małymi literami.
#!/bin/bash
for nazwa in * do
mv $nazwa `echo $nazwa | tr '[A-Z]' '[a-z]'` done
exit 0
12.
Napisać funkcję sprawdzają, czy dany rok jest rokiem przestępnym. Następnie napisać skrypt, który dla dowolnej ilości argumentów sprawdza, czy rok podany jako argument jest rokiem przestępnym.
#! /bin/bash 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 ] ; then return 0 else return 1 fi } for i in $*; do if przestepny $i ; then echo " $rok: rok przestepny" else
echo "$rok: rok nieprzestepny" fi
done
Karolina Wojcik ++
13.
Zadania - skrypty
Napisać skrypt, który będzie działał jak funkcja 'Znajdź i Zamień'. Skrypt powinien modyfikować wszystkie pliki o zadanym rozszerzeniu znajdując szukany wzorzec i zamieniając go na inny wzorzec.
#!/bin/bash
PLIKI="*.htm" WZORZEC1="H1"; WZORZEC2="H2";
for plik in `find . -path "$PLIKI"` do
echo $plik
sed "s/$WZORZEC1/$WZORZEC2/g" $plik > wynik.tmp mv wynik.tmp $plik
done;
rm wynik.tmp
exit 0
1.
Napisać skrypt obliczający sumę wczytanych liczb aż do napotkania zera.
#!/bin/bash
SUMA=0
echo "Wpisz liczby calkowite (0 to koniec):" while true ; do read LICZBA SUMA=$[$SUMA+$LICZBA] if [ $LICZBA = "0" ] ; then break fi done
echo "Suma wczytanych liczb wynosi: $SUMA"
exit 0 ---#! /bin/bash n=0 l=1 while [$l -ne0] do read l n=$[l+n] done echo suma:$n exit 0 Magdalena Wiesner ++
Napisać skrypt obliczający silnię z liczby naturalnej podanej jako parametr skryptu.
#!/bin/bash
if [ $# -eq 0 ] then
echo "Prawidlowe wywolanie skryptu: $0 liczba_naturalna" exit 1
fi silnia=1
for (( i=1; i<=$1; i++ )) do
silnia=`expr $silnia * $i` done
echo "Silnia z liczby $1 = $silnia"
exit 0 ---#! /bin/bash n=1 i=1 if [ $1 -lt 0]
then echo "Liczba < 0!" exit 1
fi
while [$i -le $1] do n=$[n*$i] i=$[i+1] done echo "$n" exit 0 #Marcin Rutkowski ++ 3.
Napisać skrypt pakujący katalog do 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.
#!/bin/bash
if [ $# -eq 0 ] then
echo "Prawidlowe wywolanie skryptu: $0 nazwa_katalogu" exit 1
fi
if [ -d $1 ] then
tar zcvf `date '+%d-%m-%y'`.tar.gz $1 else
echo "Podany parametr powinien byc katalogiem" exit 1 fi exit 0 ---#!/bin/bash if [ $1 ] then if [ -d $1 ]
then tar -cvvf 2005-03-23.tar.gz $1/ else echo " $1 nie jest katalogiem " fi
else echo " nie podano parametru " fi
exit 0
#Justna Benkowska ++
Napisać skrypt rysujący trójkąt równoramienny z gwiazdek o podstawie podanej przez użytkownika jako parametr skryptu.
#!/bin/bash
if [ -z $1 ] then
echo "Prawidlowe wywolanie skryptu: $0 podstawa_trojkata" exit 1
fi
liczba=$1 i=1 pom=1
while [ "$i" -le $liczba ] do
j=$i
while [ "$j" -le $liczba ] do echo -n "*" j=$(($j+1)) done echo "" pomoc=1
while [ "$pomoc" -le $pom ] do echo -n " " pomoc=$(($pomoc+1)) done pom=$(($pom+1)) i=$(($i+2)) done echo "" exit 0 ---#!/bin/bash
echo Podaj dlugosc podstawy: read x i=$[x] declare tab[x] declare tab2[x] while [ $x -gt 0 ] do tab[x]='*' x=$[x-1] done x=$[x-1] j=$[x] 5.
while [ $x -gt 0 ] do
j=0
while [ $j -le $[i-x-1]] do tab2[j]='*' j=$[j+1] done x=$[x-1] echo "${tab2[*]}" done echo "${tab[*]}" Piotr Jarosz
Napisać skrypt sprawdzający, czy istnieje podany jako parametr plik i wypisujący odpowiedni komunikat na ekranie.
#! /bin/bash test -e $1
if [ $? -gt 0 ] ; then echo plik nie istnieje
else
echo plik istnieje Karolina Wojcik ++
6.
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" else
echo "To jest nowy plik" > $1 fi
exit 0
#Marcin Rutkowski ++
7.
Napisać skrypt kopiujący wszystkie pliki o rozszerzeniu ".txt" do podanego jako argument katalogu, jeśli podany katalog nie istnieje należy go najpierw stworzyć.
#! /bin/bash if [-e $1]
then echo "katalog $1 istnieje" else
echo "katalog $1 nie istnieje wiec go teorzymy" mkdir $1 fi cp *.txt $1 exit 0 Justna Benkowska ++ 8.
Napisać skrypt usuwający wszystkie pliki z katalogów "podkatalog1" i "podkatalog2". Przed usunięciem nazwa pliku powinna zostać wypisana na ekranie terminala, dodatkowo przy usuwaniu powinno pojawić się pytanie o potwierdzenie.
#!/bin/bash rm -i $1/* rm -i $2/* exit 0 LUKASZ KOMAR + ---#!/bin/sh i=1 while [ $i -le $#] do rm -ivr $1/* shift 9.
done exit 0 Paweł Brzeski ++ ---!# /bin/bash rm -i -r $@ exit 0 LUKASZ KOMAR ++
Napisać skrypt, który jako parametry przyjmuje nazwę pliku, ściężkę do 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.
10.
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 $@ exit 0
LUKASZ KOMAR ++
11.
Sporządzić listę plików, znajdujących się w katalogu domowym, 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".)
#! /bin/bash ls -i | sort -r
Malgorzata Krzyzanowska +
12.
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"
13.
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.
#! /bin/bash
KATALOG="$1"
if [ -n "KATALOG" -a -d "KATALOG" ] ; then ls $KATALOG
exit fi
while terue ; do echo
read -p "podaj katalog:" KATALOG if [ -z "KATALOG" ] ; then continue fi if [ -d KATALOG ] ; then ls $KATALOG exit fi done Karolina Wojcik 14.
Jak wyzej, w przypadku nacisnięcia litery "q", po wydaniu zapytania należy przerwać wykonanie skryptu. #!/bin/sh if [ -d $1 ] then ls -l $1 else
echo "Podaj nazwe katalogu: " read katalog
case "$katalog" in "q" exit 0;;
esac if [-d $katalog] then ls -l $katalog fi fi exit 0 Piotr Kisieliczyn +++
Jak wyżej, jeśli katalog jest pusty, podać odpowiedni komunikat, dodatkowo opcjonalnie dodać drugi parametr będący liczbą sekund, na którą system wstrzyma wykonanie skryptu.
16.
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 identyfikator i listę terminali, na których pracuje. Informacje o kolejnych użytkownikach powinny być oddzielone ciągiem gwiazd.
17.
Napisać skrypt zapisujący do pliku o nazwie "plik.usr", pełną informację o użytkownikach, którzy mają aktualnie odblokowane przyjmowanie komunikatów na terminal.
18.
Napisać skrypt liczący łączną liczbę słów z pierwszych trzech linii plików zaczynających się na "p" lub "k".
19.
Napisać skrypt wyświetlający w odwrotnej kolejności argumenty jego wywołania. (np. skrypt a b c d => d c b a)
20.
Wysłać za pomocą poczty elektronicznej do wszystkich aktualnie zalogowanych użytkowników systemu wiadomość zapisaną w pliku wiadomość w taki sposób, aby wiadomość została wysłana osobno dla każdego użytkownika
!/bin/bash
adresy='who | cut -f1 -d " " |sort -n' for ile in $adresy
do
mail $ile -s "Teamt" < wiadomosc done
Piotr Kisieliczyn
21.
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]
then echo "Podaj parametry: nazwy katalogow do sprawdzenia" exit
fi
for katalog in $* do
find $katalog - type d 2 >/dev/null| awk -F/ '{print $0 ":" NF -1}'| sort -t: +1nr| head -1| awk -f:'{print $1 "\t" $2}' done Magdalena Wiesner 22.
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ą dodatkowo 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 domowego lub numeru grupy użytkownika. Polecenie "koniec" powoduje zakończenie pracy skryptu.
#!/bin/bash
x=1;
while [ $x != 0 ] do
echo "Podaj polecenie:"
read polecenie
case $polecenie in
"katalog")
echo "Podaj nazwe uzytkownika:"; read user;
echo "Katalog domowy 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;; esac done Piotr Jarosz
Napisać skrypt sprawdzający czy któryś z użytkowników o identyfikatorach podanych w argumentach wejściowych nadał grupie lub innym prawa r, w lub x do swojego katalogu. Jeśli tak to należy wyświetlić na ekranie i zapisać do 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ć.
24.