ASK_Lab3_AdamSalwowski.org 7.2 KB

Zadania

Zadanie 1

Zadanie 2

    :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:
  1. 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.
  2. Skrypt wywoła się jedynie dla pierwszego parametru oraz gdy ten parametr jest liczbą.
  3. Jeśli parametr jest mniejszy-równy (-le = leser-equal) 0, zwracam 1.
  4. Jeśli parametr jest równy (-eq = equal) 1, zwracam 1.
  5. W pozostałych przypadkach, zwracam wynik obliczeń.
  6. 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.
  7. Na końcu wywołanie funkcji, dla jednego, pierwszego parametru podanego przez użytkownika.
  8. 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:
  9. Sprawdzamy czy użytkownik podał poprawnie parametry, jeśli nie kończymy działanie skryptu z informacją zwrotną.
  10. 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 )
  11. Przypisujemy zmiennym wartości. Zmiennej katalog wartości pierwszego parametru, max=0, min=99999999.
  12. Pętla for
  13. 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=.
  14. Komenda find przeszukuje $katalog wybrany przez użytkownika.
  15. Szuka plików zwykłych sprecyzowanych poprzez flagę -type f
  16. Następnie określa poprzez flagę -printf jak wynik wyszukiwania ma wyglądać.
  17. %s określa wielkość pliku w bajtach.
  18. : jest dosłownie dwukropkiem, pojawi się w łańcuchu pliku.
  19. %p określa nazwę pliku (absolutną ścieżkę).
  20. \n określa nową linię.
  21. Komenda sort sortuje wyniki.
  22. Flaga -n oznacza sortowanie poprzez wartości numeryczne.
  23. Flaga -t ' ' określa separator, w tym przypadku spację.
  24. 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...
  25. Zmienna w=${i%%:*} teraz nosi wartość samej wielkości pierwszego pliku.
  26. ${i%%:*} oznacza zwróć wartość łancucha i, ale usuń wszystko występujące po znaku : włącznie.
  27. Czyli pod łańcuchem w teraz kryje się tylko wielkość najmniejszego pliku w bajtach.
  28. 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.
  29. Wyświetl łancuch odnoszący się do największego pliku zwykłego.
  30. Wyświetl łancuch odnoszący się do najmniejszego pliku zwykłego.
  31. 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.