Nowe posty

Autor Wątek: "Prosty" skrypt w powłoce Bash  (Przeczytany 2959 razy)

Offline faringo

  • Users
  • Nowy na forum
  • *
  • Wiadomości: 1
    • Zobacz profil
"Prosty" skrypt w powłoce Bash
« dnia: 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.

beaker

  • Gość
Odp: "Prosty" skrypt w powłoce Bash
« Odpowiedź #1 dnia: 2020-01-12, 11:24:10 »

Offline Paweł Kraszewski

  • Administrator
  • Guru
  • *****
  • Wiadomości: 3047
  • Lenistwo jest matką potrzeby = babcią wynalazku
    • Zobacz profil
Odp: "Prosty" skrypt w powłoce Bash
« Odpowiedź #2 dnia: 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.
Paweł Kraszewski
~Arch/Void/Gentoo/FreeBSD/OpenBSD/Specjalizowane customy

Offline ultr

  • Users
  • Guru
  • *****
  • Wiadomości: 1177
    • Zobacz profil
Odp: "Prosty" skrypt w powłoce Bash
« Odpowiedź #3 dnia: 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

beaker

  • Gość
Odp: "Prosty" skrypt w powłoce Bash
« Odpowiedź #4 dnia: 2020-01-16, 07:58:25 »
spój na wcześniejszy link, tam masz odpowiedzi do zadania.

Offline p.nowak

  • Users
  • Nowy na forum
  • *
  • Wiadomości: 5
    • Zobacz profil
Odp: "Prosty" skrypt w powłoce Bash
« Odpowiedź #5 dnia: 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"?

Offline 1709

  • Users
  • Guru
  • *****
  • Wiadomości: 2757
  • 1709
    • Zobacz profil
Odp: "Prosty" skrypt w powłoce Bash
« Odpowiedź #6 dnia: 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.
« Ostatnia zmiana: 2020-01-19, 16:39:32 wysłana przez 1709 »
PS: Brak polskiej czcionki, nie jest to brak lenistwa, a jej brak w systemie i brak czasu na reczne poprawki.

Offline 1709

  • Users
  • Guru
  • *****
  • Wiadomości: 2757
  • 1709
    • Zobacz profil
Odp: "Prosty" skrypt w powłoce Bash
« Odpowiedź #7 dnia: 2020-01-21, 15:14:47 »
I jak Ci idzie z napisaniem skryptu? Możesz pokazać?
PS: Brak polskiej czcionki, nie jest to brak lenistwa, a jej brak w systemie i brak czasu na reczne poprawki.

Offline p.nowak

  • Users
  • Nowy na forum
  • *
  • Wiadomości: 5
    • Zobacz profil
Odp: "Prosty" skrypt w powłoce Bash
« Odpowiedź #8 dnia: 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

Offline 1709

  • Users
  • Guru
  • *****
  • Wiadomości: 2757
  • 1709
    • Zobacz profil
Odp: "Prosty" skrypt w powłoce Bash
« Odpowiedź #9 dnia: 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.
« Ostatnia zmiana: 2020-01-24, 22:51:35 wysłana przez 1709 »
PS: Brak polskiej czcionki, nie jest to brak lenistwa, a jej brak w systemie i brak czasu na reczne poprawki.