• Nie Znaleziono Wyników

Laboratorium 06 - bash

N/A
N/A
Protected

Academic year: 2021

Share "Laboratorium 06 - bash"

Copied!
10
0
0

Pełen tekst

(1)

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 Linki

Laboratorium_6

Ostatnia aktualizacja: 2005-03-30 11:08:17

skrypty 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"

(2)

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

(3)

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

(4)

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

(5)

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

(6)

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.

(7)

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.

(8)

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;;

(9)

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:"

(10)

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.

Cytaty

Powiązane dokumenty

Rezultat działania polecenia ps -u (procesy użytkownika trafi do pliku o nazwie procesy.txt, jeśli wcześniej nie istniał plik o takiej samej nazwie, to zostanie utworzony,

• Możliwość wykonania danej operacji na określonych rastrach może być uzależniona od głębokości piksela, typu kodowania danych, (np. rastry typu „ze znakiem” nie

zalaniem/podtopieniem) obiektów publicznych (urzędy, szkoły, remizy, boiska, inne jakie?) Podać ilość i dokładny opis. Podać dokładną ilość oraz opis z powierzchnią

Następnie zapisz zmodyfikowane dane do pliku o nazwie złożonej ze starej nazwy i wyrażenia „_wg_ocen” – czyli dla przykładu „studenci_wg_ocen.txt”..

Napisać skrypt, który znajdzie w bieżącym katalogu wszystkie pliki, które zawierają w swojej treści swoja nazwę.. Napisać skrypt, który wczyta plik zawierający liczby (po jednej

/D:data - Kopiuje tylko te pliki które zostały utworzone lub zmodyfikowane po podanej dacie /P - Wymaga potwierdzenia przed zapisaniem ka dego pliku. /V - Weryfikuje poprawno

W tym celu z menu Plik przeglądarki wybieramy Zapisz stronę jako, w oknie dialogo- wym przechodzimy do katalogu docelowego i ewentualnie zmieniamy nazwę pliku do

Miesiąc - to pole precyzuje, za który miesiąc, za który naliczone są wpłaty (składki) korygowane w pliku. Informacja o tym, czy składka podstawowa za wybrany miesiąc