Programowanie > Bash, skrypty powłoki

"Prosty" skrypt w powłoce Bash

<< < (2/2)

p.nowak:
Co to znaczy opcja "-h"? Skrypt ma porównać czy parametr który podam jest nazwą katalogu lub wyrażeniem "-h"?

1709:

--- Cytuj ---Napisz skrypt przyjmujący jeden, dwa lub trzy parametry.
--- Koniec cytatu ---
Przyklad, opcja --help wyswietla wszystkie opcje

--- Kod: ---
$ 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
--- Koniec kodu ---


--- Cytuj ---Pierwszy parametr może być nazwą katalogu albo opcją "-h".
--- Koniec cytatu ---
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.
--- Koniec cytatu ---
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

--- Kod: ---
[ "$(ls -A katalog | grep ^"d")" ] && echo "Tak jest" || echo "Nie niema "
--- Koniec kodu ---


Poprawiłem trochę przykład. Dodałem grep żeby wyłowić tylko katalogi.
Można go przetestować w terminalu.

--- Kod: ---
$ [ "$(ls -A Desktop | grep ^"d")" ] && echo "Tak jest" || echo "Nie niema "
Tak jest
--- Koniec kodu ---
Z test wygląda to prościej.

--- Kod: ---
$ test -d plik && echo "Tak jest folder." || echo "Nie ma folderu."
Nie ma folderu.
--- Koniec kodu ---
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.
--- Koniec cytatu ---
=============
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.

1709:
I jak Ci idzie z napisaniem skryptu? Możesz pokazać?

p.nowak:
Na razie słabo:)

--- Kod: ---
#!/bin/bash
if [[ $1 = "-h" ]]; then
 grep home /etc/passwd
else
find /$1 -type d | ls -d */ | du -k
fi

--- Koniec kodu ---

1709:

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

--- Koniec cytatu ---
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.

--- Kod: ---
skrypt "nazwa katalogu"
--- Koniec kodu ---
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.

Nawigacja

[0] Indeks wiadomości

[*] Poprzednia strona

Idź do wersji pełnej