:PROPERTIES:
:UNNUMBERED: t
:END:
#+begin_quote
/Proszę napisać skrypt obliczający wybrane wyrazy ciągu Fibbonacciego, których numery zadawane będą jako parametry. Działanie skryptu należy udokumentować w sprawozdaniu./
#+end_quote
Skrypt:
#+begin_src shell :results output code :wrap src text :tangle zadanie1.sh
#!/bin/bash
fib(){
if [[ $1 -le 0 ]]; then
echo 0
elif [[ $1 -eq 1 ]]; then
echo 1
else
echo $(( $(fib $(($1-2)) ) + $(fib $(($1 - 1)) ) ))
fi
}
fib $1
#+end_src
Opis skryptu:
Po pierwsze, zadeklarowałem funkcję o nazwie fib, by móc odwołać się do niej w skrypcie. Zapewne inną możliwośćią byłoby odwołać się do nazwy pliku dzięki zmiennej $0, by wywołać ją dla mniejszych wartości.
Skrypt wywoła się jedynie dla pierwszego parametru oraz gdy ten parametr jest liczbą.
Jeśli parametr jest mniejszy-równy (-le = leser-equal) 0, zwracam 1.
Jeśli parametr jest równy (-eq = equal) 1, zwracam 1.
W pozostałych przypadkach, zwracam wynik obliczeń.
1) Nawiasy =$(())= służą do kalkulacji. Możliwe są w nich obliczenia wyłącznie liczb całkowitych.
2) Pojedyńczy nawias =$()= informuje, że w środku znajduję się funkcja do wykonania.
3) W tym nawiasie obliczamy sumę dwóch wywołań funkcji =fib= dla parametru najpierw o 2 a następnie o 1 mniejszego niż podaliśmy przy wykonywaniu skryptu
4) =$(($1-1))= czytamy jako odejmowanie od liczby, która kryję się pod zmienną =$1= (w poniższym przykładzie =20=) wartości 1.
5) Czyli =$(fib $(($1 - 1))= czytamy jako wykonanie się funkcji =fib 19=.
6) =$(( $(fib $(($1-2)) ) + $(fib $(($1 - 1)) ) ))= oznacza zsumuj wyniki funkcji =fib 18= i =fib 19=. Spacje dodałem dla lepszej czytelności.
Na końcu wywołanie funkcji, dla jednego, pierwszego parametru podanego przez użytkownika.
Nadaję prawa uruchamiania i uruchamiam skrypt.
#+begin_src shell :results output code :wrap src text
chmod +x zadanie1.sh
./zadanie1.sh 20
#+end_src
Wynik:
#+RESULTS:
#+begin_src text
6765
#+end_src
Wynik dla wartości podanej wartości 20 jako pierwszy parametr. Wyższe wartości nie są rekomendowane, wykonywanie skryptu może trochę potrwać.
#+begin_quote
/Proszę przeanalizować skrypt: ./skr4 katalog (opisany w dokumencie 10 )./
#+end_quote
Skrypt:
#+BEGIN_SRC shell :results output code :wrap src text :tangle zadanie2.sh
#!/bin/bash
# ./skr4 katalog
# Program przeszukuje zadany katalog i wyswietla informacje
# o najwiekszym i najmniejszym pliku.
if [ $# -lt 1 -o $# -gt 1 ]; then
echo 'bledny parametr !'
echo './skr4 katalog'
exit
fi
katalog=$1
max=0
min=99999999
# zadanie malej i bardzo duzej wartości liczb w sprawdzanych w instrukcjach
# warunkowych nie jest zadowalajace z punktu widzenia algorytmiki,
# ale spelnia wymogi praktyczne
for i in `find $katalog -type f -printf '%s:%p\n' | sort -n -t ' '`; do
# w=$[i%%:*]
w=${i%%:*}
if [[ $w -gt $max ]]; then
max=$w
maxn="$i"
fi
if [[ $w -lt $min ]]; then
min=$w
minn="$i"
fi
echo "$i"
done
echo 'najwiekszy:' "$maxn"
echo 'najmniejszy:' "$minn"
#+END_SRC
Opis skryptu:
Sprawdzamy czy użytkownik podał poprawnie parametry, jeśli nie kończymy działanie skryptu z informacją zwrotną.
1) Pod zmienną =$#= kryje się ilość podanych parametrów.
2) Flaga =-o= zwraca =true= jeśli podany parametr jest plikiem oraz użytkownik wykonujący skrypt jest jego posiadaczem. ( chyba źle )
Przypisujemy zmiennym wartości. Zmiennej katalog wartości pierwszego parametru, max=0, min=99999999.
Pętla for
1) Iteratorem jest zmienna =i=.
2) Elementami są wyniki komendy wziętej w nawiasy =``= (pełnią tę samą funkcję co nawiasy =$()=), w tym przypadku =find=.
Komenda find przeszukuje $katalog wybrany przez użytkownika.
Szuka plików zwykłych sprecyzowanych poprzez flagę -type f
Następnie określa poprzez flagę -printf jak wynik wyszukiwania ma wyglądać.
%s określa wielkość pliku w bajtach.
: jest dosłownie dwukropkiem, pojawi się w łańcuchu pliku.
%p określa nazwę pliku (absolutną ścieżkę).
\n określa nową linię.
Komenda sort sortuje wyniki.
Flaga -n oznacza sortowanie poprzez wartości numeryczne.
Flaga -t ' ' określa separator, w tym przypadku spację.
3) Tutaj nastąpiła *pomyłka*. Pojawiły się nawiasy kwadratowe (=$[]=) które pełnią taką samą funkcję jak nawiasy =$(())=.
4) Zasępuję je nawiasami klamrowymi (=${}=), służącymi do manupulowania wartościami łancucha, substytucji, itd...
Zmienna w=${i%%:*} teraz nosi wartość samej wielkości pierwszego pliku.
${i%%:*} oznacza zwróć wartość łancucha i, ale usuń wszystko występujące po znaku : włącznie.
Czyli pod łańcuchem w teraz kryje się tylko wielkość najmniejszego pliku w bajtach.
5) Jeżeli =$w= jest większe od =$max=, =$max=$w= oraz nowa zmienna =$maxn= równająca się obecnie największemu plikowi.
6) Jeżeli =$w= jest mniejsze od =$min=, =$min=$w= oraz nowa zmienna =$minn= równająca się obecnie najmniejszemu plikowi.
7) Wyświetl łańcuch =$i=, który był iterowany.
Wyświetl łancuch odnoszący się do największego pliku zwykłego.
Wyświetl łancuch odnoszący się do najmniejszego pliku zwykłego.
Nadaję uprawnienia do egzekwowania, a następnie uruchamiam na wybranym katalogu.
#+BEGIN_SRC shell :results output code :wrap src text
chmod +x zadanie2.sh
./zadanie2.sh ~/Downloads
#+END_SRC
Wynik:
#+RESULTS:
#+begin_src text
1022:/home/zadca123/Downloads/Pliki/obrazek.bmp
1608:/home/zadca123/Downloads/pics_and_vids/1634640146487s.jpg
2010:/home/zadca123/Downloads/pics_and_vids/1634197615870s.jpg
3228:/home/zadca123/Downloads/Pliki/lab002.py
7376:/home/zadca123/Downloads/Pliki/obrazek3.png
10379:/home/zadca123/Downloads/Pliki/obrazek2.jpg
10447:/home/zadca123/Downloads/Pliki.zip
14520:/home/zadca123/Downloads/Pliki/dane2.txt
367440:/home/zadca123/Downloads/eee.zip
100152301:/home/zadca123/Downloads/TeamSpeak3-Client-linux_amd64-3.5.6.run
3319534169:/home/zadca123/Downloads/archive_2021-10-18.7z
najwiekszy: 3319534169:/home/zadca123/Downloads/archive_2021-10-18.7z
najmniejszy: 1022:/home/zadca123/Downloads/Pliki/obrazek.bmp
#+end_src
Proszę się upewnić, że wszystkie pliki w katalogu *nie mają spacji w nazwie*, inaczej wystąpią problemy.