Forum Linux.pl

Programowanie => Bash, skrypty powłoki => Wątek zaczęty przez: faringo w 2020-01-12, 11:08:35

Tytuł: "Prosty" skrypt w powłoce Bash
Wiadomość wysłana przez: faringo w 2020-01-12, 11:08:35
Witajcie, uczę się liceum i na zaliczenie przedmiotu jakim jest informatyka, nauczyciel zlecił nam napisanie skryptu w dowolnej dystrybucji Linuxa w powłoce Bash. Polecenie do zadania brzmi następująco:

Napisz skrypt przyjmujący jeden, dwa lub trzy parametry. Pierwszy parametr może być nazwą katalogu albo opcją "-h". Jeżeli jest nazwą katalogu, zadaniem skryptu jest wyszukanie w tym katalogu podkatalogów pierwszego poziomu zagłębienia i obliczenie, ile zajmują miejsca (w kilobajtach). Wyniki należy wyświetlić na ekranie, posortowane według wielkości. Jeżeli pierwszy parametr to opcja "-h", skrypt powinien obliczyć wielkość (w kilobajtach) katalogów domowych wszystkich użytkowników systemu i posortować je według wielkości.

Stąd kieruję się do Was o pomoc, nigdy nie programowałem w żadnym języku, moja wiedza z informatyki jest dosyć znikoma. Znalazłem kursy pisania skryptów w internecie, udało mi się po długim boju zainstalować Linuxa na wirtualnej maszynie, lecz jedyne programy w powłoce jakie napisałem to wyświetlanie tekstu i uruchamianie skryptu z wiersza poleceń. Mógłbym Was poprosić o pomoc w napisaniu powyższego programu, lub chociaż nakierowanie mnie na właściwy tor? Pozdrawiam.
Tytuł: Odp: "Prosty" skrypt w powłoce Bash
Wiadomość wysłana przez: beaker w 2020-01-12, 11:24:10
http://kurslinux.com/parametry.html
Tytuł: Odp: "Prosty" skrypt w powłoce Bash
Wiadomość wysłana przez: Paweł Kraszewski w 2020-01-12, 13:00:30
Jeżeli nauczyciel wymaga na zaliczenie czegoś, czego nie było na zajęciach, to go po prostu zgłoś do kuratorium.
Tytuł: Odp: "Prosty" skrypt w powłoce Bash
Wiadomość wysłana przez: ultr w 2020-01-16, 03:26:35
>Napisz skrypt przyjmujący jeden, dwa lub trzy parametry.
$#, $1, $2, $3

>Pierwszy parametr może być nazwą katalogu
man test

>wyszukanie w tym katalogu podkatalogów pierwszego poziomu zagłębienia
man find

> obliczenie, ile zajmują miejsca (w kilobajtach).
man du

>Wyniki należy wyświetlić na ekranie, posortowane według wielkości.
man sort

>skrypt powinien obliczyć wielkość (w kilobajtach)
man du

>katalogów domowych wszystkich użytkowników systemu
Można przeszukać plik /etc/passwd,
ale chyba prościej założyć, że chodzi o wszystkie katalogi z /home

>i posortować je według wielkości.
man sort
Tytuł: Odp: "Prosty" skrypt w powłoce Bash
Wiadomość wysłana przez: beaker w 2020-01-16, 07:58:25
spój na wcześniejszy link, tam masz odpowiedzi do zadania.
Tytuł: Odp: "Prosty" skrypt w powłoce Bash
Wiadomość wysłana przez: p.nowak w 2020-01-19, 13:45:35
Co to znaczy opcja "-h"? Skrypt ma porównać czy parametr który podam jest nazwą katalogu lub wyrażeniem "-h"?
Tytuł: Odp: "Prosty" skrypt w powłoce Bash
Wiadomość wysłana przez: 1709 w 2020-01-19, 15:41:40
Cytuj
Napisz skrypt przyjmujący jeden, dwa lub trzy parametry.
Przyklad, opcja --help wyswietla wszystkie opcje
$ ls --help
  -a,   --all                  do not ignore entries starting with .
  -A,   --almost-all           do not list implied . and ..
         --author               with -l, print the author of each file
         --help     display this help and exit

Cytuj
Pierwszy parametr może być nazwą katalogu albo opcją "-h".
Czyli powinniśmy móc wykonać " skrypt katalog " lub " skrypt -h "

Cytuj
Jeżeli jest nazwą katalogu, zadaniem skryptu jest wyszukanie w tym katalogu podkatalogów pierwszego poziomu zagłębienia i obliczenie, ile zajmują miejsca (w kilobajtach). Wyniki należy wyświetlić na ekranie, posortowane według wielkości.
Wiesz już co to są parametry.
Możesz nawet sobie wyświetlić jaki parametr wybierasz przy uruchomieniu skryptu " echo $1 "
Czym porównasz czy twój parametr jest katalogiem?
- Dla mnie pytanie nie jest oczywiste, ja bym przeszukał cały system (locate)
  W poradnikach w internecie można znaleźć także test
 ( "-d - plik istnieje i jest katalogiem,  True if pathname resolves to an existing directory " )
  Zamiast test mozna sprawdzic przy pomocy ls -l
[ "$(ls -A katalog | grep ^"d")" ] && echo "Tak jest" || echo "Nie niema "


Poprawiłem trochę przykład. Dodałem grep żeby wyłowić tylko katalogi.
Można go przetestować w terminalu.
$ [ "$(ls -A Desktop | grep ^"d")" ] && echo "Tak jest" || echo "Nie niema "
Tak jest
Z test wygląda to prościej.
$ test -d plik && echo "Tak jest folder." || echo "Nie ma folderu."
Nie ma folderu.
Jak zauważyłeś użyłem skróconej formy " if " , ale do tworzenia menu najczęściej używa się " case ".

Cytuj
Jeżeli pierwszy parametr to opcja "-h", skrypt powinien obliczyć wielkość (w kilobajtach) katalogów domowych wszystkich użytkowników systemu i posortować je według wielkości.
=============
Wiec zrób sobie teraz plan, co powinien zrobić skrypt.
- Czyli mamy miec dwie opcje, ale moze byc ich wiecej.
- Możemy uzyc case zeby zrobic menu, w ktorym beda np. te dwie opcje do wyboru. ( -h lub inne)
- Jezeli opcja "-h" to zrobi to i to
- Jezeli opcja wszystko inne to sprawdzi czy jest to katalogiem i zrobi to i tamto.
- Może jeszcze dodam, ze żeby menu case (w skrypcie) ładniej wyglądało, to zbiór poleceń ("zrób to i tamto") możesz zapisać do funkcji,
a potem użyć tą funkcje w case. A to taka tylko kosmetyka i każdy zrobi jak będzie chciał.

Potem, na podstawie planu zacznij tworzyć skrypt.
Tytuł: Odp: "Prosty" skrypt w powłoce Bash
Wiadomość wysłana przez: 1709 w 2020-01-21, 15:14:47
I jak Ci idzie z napisaniem skryptu? Możesz pokazać?
Tytuł: Odp: "Prosty" skrypt w powłoce Bash
Wiadomość wysłana przez: p.nowak w 2020-01-22, 20:16:48
Na razie słabo:)
#!/bin/bash
if [[ $1 = "-h" ]]; then
 grep home /etc/passwd
else
find /$1 -type d | ls -d */ | du -k
fi
Tytuł: Odp: "Prosty" skrypt w powłoce Bash
Wiadomość wysłana przez: 1709 w 2020-01-24, 12:27:13
Cytuj
Napisz skrypt przyjmujący jeden, dwa lub trzy parametry. Pierwszy parametr może być nazwą katalogu albo opcją "-h". Jeżeli jest nazwą katalogu, zadaniem skryptu jest wyszukanie w tym katalogu podkatalogów pierwszego poziomu zagłębienia i obliczenie, ile zajmują miejsca (w kilobajtach). Wyniki należy wyświetlić na ekranie, posortowane według wielkości. Jeżeli pierwszy parametr to opcja "-h", skrypt powinien obliczyć wielkość (w kilobajtach) katalogów domowych wszystkich użytkowników systemu i posortować je według wielkości.
1. Kolorami zaznaczyłem jednakowe zadania.
2. Mozna dodac / przyjac trzeci parametr.
Przy dwóch parametrach, jesli nie znajdzie katalogu moze czasami nic nie wyswietlic.
Dlatego mozna dodac jakis komunikat / informacje, ze podana nazwa katalogu jest nie prawidlowa lub ze nie znaleziono takiego katalogu.
Brak informacji nie jest bledem, ale dodatkowe informacje przydaja sie jesli nie jestesmy pewni co zrobil skrypt.
Przydatne zwłaszcza gdy szukamy przyczyny wadliwego działania programu, nazywane "debugowaniem".
3. W poradnikach czesto nie ma, ale parametry i zmienne w skrypcie pisz w cudzysłowach "$1" .
Ma to znaczenie,
- bo jesli przy uruchamianiu skryptu podasz nazwe katalogu z bez cudzyslowia, to system rozpozna to jako dwie nazwy i nie znajdzie.
- Jesli podasz nazwe z cudzyslowiem, ale w skrypcie bez cudzyslowia, to ponownie skrypt moze wykonac sie nie prawidlowo
- Dlatego, jesli wpisujesz w terminalu ze spacja nazwe katalogu, to ta nazwa musi byc w cudzyslowie i w skrypcie także.
skrypt "nazwa katalogu"
Od cudzyslowia moze znajdziesz kiedys wyjatki, ale staraj sie ich uzywac.
4. Linia nr. 5 --> " find /$1 " , nie jestem pewien co miales na mysli.
" / " (bez cudzyslowia)  wystarczylby, dajac w ten sposob znac chce chcesz szukac w calym systemie
nazwe katalogu, czyli parametr musisz dac osobno i musisz zaznaczyc jakos komendzie find ze jest to nazwa.
Z " man find " , znajdziesz ze jest to opcja " -name ", czyli razem to " -name "$1" "
6. Linia nr. 2. Mam dobne zastrzezenie do nawiasu, aczkolwiek skrypt dziala, wiec to szczegół.
Zerknij na przyklady gdzie, gdy sa podwojne nawiasy kwadratowe "[[" to jest "==" zamiast "="
 https://linuxacademy.com/blog/linux/conditions-in-bash-scripting-if-statements/
https://bash.0x1fff.com/polecenia_wbudowane/polecenie_square_bracket.html
7. Linia nr. 3 " grep home /etc/passwd " , do "wylowienia" samych nazw katalogow uzytkownika mozesz uzyc komendy cut
Opcja cut pozwala na wybranie seperatora, ktorym bedzie w tym przypadku dwukropek
czyli cut -d ":" -f costam , musisz sam dokonczyc :)
- Seperator to cos oddziela jakies fragmenty tekstu ktore chcialbys np usunac.
- W komendzie cut jako separatora mozna uzyc tylko jednego znaku.
https://www.thegeekstuff.com/2013/06/cut-command-examples/

PS: Jak poprawisz skrypt mozesz ponownie pokazac, moze jeszcze cos doradzimy.