BASH problem z gzip

CR
  • Rejestracja:ponad 5 lat
  • Ostatnio:prawie 4 lata
  • Postów:64
0
Kopiuj
#!/bin/sh
if[$#!=0]; then
gzip.$1;
else echo "Podaj rozszerzenie"
read L2
gzip.L2
fi

cos nie dziala, ale nie mam pojecia co ;/
tresc zadania
Napisz skrypt, który skompresuje gzipem wszystkie pliki o rozszerzeniu
podanym jako parametr tego skryptu. Skrypt powinien być odporny na
błędy i interaktywnie zapytać o rozszerzenie, gdyby nie podano go jako
parametr.

edytowany 2x, ostatnio: cryptondr
Zobacz pozostały 1 komentarz
Silv
PS. Czemu #!/bin/sh, a nie #!/bin/bash?
CR
tak sie nauczylem na tutorialach, tak pisali tam
Silv
sh jest bardziej przenośne, pewnie czasem lepsze; tylko w takim wypadku nie wiem, czy tag bash ma sens.
CR
czyli zostac przy pisaniu sh? czy bash?
Silv
W tym zadaniu zostań przy sh. Na przyszłość możesz przeczytać np. to: https://stackoverflow.com/questions/5725296/difference-between-sh-and-bash
Patryk27
Moderator
  • Rejestracja:prawie 18 lat
  • Ostatnio:prawie 2 lata
  • Lokalizacja:Wrocław
  • Postów:13042
2

Co to znaczy coś nie działa - skrypt dzwoni na policję zamiast zwracać rozszerzenie?


edytowany 1x, ostatnio: Patryk27
CR
  • Rejestracja:ponad 5 lat
  • Ostatnio:prawie 4 lata
  • Postów:64
1

ah, przepraszam zapomnialem wrzucic blad
syntax error: "then" unexpected

Patryk27
Moderator
  • Rejestracja:prawie 18 lat
  • Ostatnio:prawie 2 lata
  • Lokalizacja:Wrocław
  • Postów:13042
0

Spacje są istotne:

Kopiuj
if [ ... ]; then
fi

CR
  • Rejestracja:ponad 5 lat
  • Ostatnio:prawie 4 lata
  • Postów:64
0

o, sluszna uwaga, dziala.
dziekuje bardzo, ale czy logicznie tez jest to napisane zgodnie z zadaniem?

Patryk27
Moderator
  • Rejestracja:prawie 18 lat
  • Ostatnio:prawie 2 lata
  • Lokalizacja:Wrocław
  • Postów:13042
2

skompresuje gzipem wszystkie pliki o rozszerzeniu
podanym jako parametr tego skryptu

gzip.$1 prawdopodobnie powinno brzmieć gzip "*.$1", podobnie przy drugim wywołaniu.

Skrypt powinien być odporny na
błędy i interaktywnie zapytać o rozszerzenie, gdyby nie podano go jako
parametr.

Nigdzie nie sprawdzasz czy L2 nie jest puste.


CR
  • Rejestracja:ponad 5 lat
  • Ostatnio:prawie 4 lata
  • Postów:64
0

gzip.$1 prawdopodobnie powinno brzmieć gzip ".$1", podobnie przy drugim wywołaniu.
rozumiem, o ile dzialanie znaku "
" rozumiem, o tyle nie za bardzo umiem sobie to w glowie poukladac, dlaczego akurat dodano go w tym miejscu i to pomiedzy " "

Nigdzie nie sprawdzasz czy L2 nie jest puste.

na szybko pomyslalem tak, dobrze?

Kopiuj
#!/bin/sh
if[$#!=0]; then
gzip.$1;
else echo "Podaj rozszerzenie"
read L2
if [L2!=0]; then
gzip.L2
else
echo "Pusty parametr"
fi
fi
TS
Pamiętaj o wcięciach. Jeżeli masz wyrażenie if to linijki miedzy if, a else oraz else, a fi powinny mieć wcięcie np. dwóch spacji. Bez tego też zadziała, ale dbajmy o czytelność kodu. Podziękujesz później.
CR
wiem o tym z innych jezykow, sluszna uwaga
TS
Za każdym razem kiedy masz pokusę zaoszczędzenia kilku sekund nie pisząc ładnego kodu pamiętaj, że go tracisz dużo więcej bo piszesz kod raz, a później czytasz ten sam kod dziesiątki razy. Czyli na kilka sekund oszczędności za każdym razem tracisz minuty na debugowaniu.
Patryk27
Moderator
  • Rejestracja:prawie 18 lat
  • Ostatnio:prawie 2 lata
  • Lokalizacja:Wrocław
  • Postów:13042
0

Nie; zupełnie nie rozumiesz kodu, który piszesz (https://en.wikipedia.org/wiki/Programming_by_permutation).

Zacznijmy powoli: napisz skrypt, który jako argument przyjmuje rozszerzenie i je wypisuje; bez żadnego sprawdzania błędów, bez żadnego gzipowania.


edytowany 1x, ostatnio: Patryk27
Silv
Do konsoli Na stdout wypisuje, doprecyzowując.
Patryk27
True, true :-)
CR
  • Rejestracja:ponad 5 lat
  • Ostatnio:prawie 4 lata
  • Postów:64
1

jak mniemam chodzi o blad w 7 linii, gdzie odnoszac sie do zmiennej zapomnialem "$"
co do twojej sugestii, nie wiem czy dobrze zrozumialem ale:

Kopiuj
#!/bin/sh
echo "Podane rozszerzenie to:"
echo $1
Patryk27
Moderator
  • Rejestracja:prawie 18 lat
  • Ostatnio:prawie 2 lata
  • Lokalizacja:Wrocław
  • Postów:13042
0

Oki, to teraz: gdybyś chciał ręcznie, z poziomu konsoli skompresować wszystkie pliki o rozszerzeniu txt, jakie polecenie byś uruchomił?


Silv
Z jakiego folderu one "wszystkie"?
Patryk27
W założeniu chodzi o aktualny katalog (tzw. working directory), lecz glob (tj. składnia *.cośtam) jest wszechstronny: możesz napisać *.txt, /jakiś/katalog/*.txt i obydwa będą działać prawidłowo.
Silv
OK, tylko mnie bardziej chodziło o precyzyjną instrukcję dla @cryptondr . :)
CR
  • Rejestracja:ponad 5 lat
  • Ostatnio:prawie 4 lata
  • Postów:64
0

gzip *.txt

Patryk27
Moderator
  • Rejestracja:prawie 18 lat
  • Ostatnio:prawie 2 lata
  • Lokalizacja:Wrocław
  • Postów:13042
0

Nice - w jaki sposób połączyłbyś teraz gzip *.txt z $1 tak, aby rozszerzenie było dynamiczne?


CR
  • Rejestracja:ponad 5 lat
  • Ostatnio:prawie 4 lata
  • Postów:64
0

na moje oko to gzip *$1

Patryk27
Moderator
  • Rejestracja:prawie 18 lat
  • Ostatnio:prawie 2 lata
  • Lokalizacja:Wrocław
  • Postów:13042
0

Zależy - czy $1 (rozszerzenie wpisywane przez użytkownika) zawiera kropkę, czy nie?


edytowany 1x, ostatnio: Patryk27
CR
zalozmy ze zawiera, to pewnie tak jak napisalem? a jesli nie to gzip*.$1 ?
Patryk27
gzip *.$1, tak (spacje są istotne!).
CR
  • Rejestracja:ponad 5 lat
  • Ostatnio:prawie 4 lata
  • Postów:64
0

czyli kod bez tych mechanizmow sprawdzajacych dla L2 wygladalby:

Kopiuj
#!/bin/sh
if [$# != 0 ]; then
gzip *$1
else echo "Podaj rozszerzenie:"
read L2
gzip *$L2
fi
Zobacz pozostałe 3 komentarze
Silv
@cryptondr: [ to oddzielne polecenie – musi być biały znak po nim, jak po każdym poleceniu.
CR
okej, juz rozumiem
Silv
Możesz sprawdzić, czy istnieje u ciebie plik /usr/bin/[. :)
Patryk27
@Silv: zależy od powłoki - np. w przypadku zsh, [ jest wbudowanym poleceniem (which [ zwraca [: shell built-in command).
Silv
Hm, skoro tak, to rzeczywiście lepiej użyć od razu which. Btw. ja się zdziwiłem, gdy odkryłem, że w Bashu echo jest wbudowanym poleceniem.
Patryk27
Moderator
  • Rejestracja:prawie 18 lat
  • Ostatnio:prawie 2 lata
  • Lokalizacja:Wrocław
  • Postów:13042
0

Tak; przy czym personalnie podszedłbym do tematu tak:

Kopiuj
#!/usr/bin/env sh

ext=$1

if [ -z "$ext" ]; then
  echo 'Podaj rozszerzenie:'
  read ext
fi

gzip *.$ext

edytowany 3x, ostatnio: Patryk27
Zobacz pozostały 1 komentarz
Patryk27
true, shebang jest istotny :-)
Silv
Chodziło mi bardziej o to, że sh nie musi oznaczać nic konkretnego, a [[ to jednak Bash…
Silv
Więc zadziałać pewnie zadziała, ale trochę mieszania dla mnie.
Patryk27
Ah, odruchowo już wrzucam te bashismy wszędzie :-P thanks, poprawione - teraz zastanawiam się jednak czy -z jest na pewno POSIXowe, czy też bashowe.
Silv
W sumie to wybacz, bo mogłem od razu poradzić mu Basha. Ale pomyślałem, żeby nie robić za dużo zmian, skoro już zaczął z sh, niech z tym skończy.
CR
  • Rejestracja:ponad 5 lat
  • Ostatnio:prawie 4 lata
  • Postów:64
0

no domyslam sie ze sa optymalniejsze sposoby, lecz zalezy mi bym rozumial co pisze, a to z warunkiem sprawdzajacym dla L2, to podobnie jak mowilem wczesniej?

Patryk27
Moderator
  • Rejestracja:prawie 18 lat
  • Ostatnio:prawie 2 lata
  • Lokalizacja:Wrocław
  • Postów:13042
0

Musiałbyś wykorzystać pętlę while, która pytałaby użytkownika o rozszerzenie tak długo, póki nie zostanie ono określone.


CR
  • Rejestracja:ponad 5 lat
  • Ostatnio:prawie 4 lata
  • Postów:64
0

a nie daloby rady zrobic tego ifem? ze jesli nie poda to po prostu wyjdzie z programu?

Patryk27
Moderator
  • Rejestracja:prawie 18 lat
  • Ostatnio:prawie 2 lata
  • Lokalizacja:Wrocław
  • Postów:13042
0

Polecenie nie określa tego precyzyjnie; ja bym wykorzystał while, lecz Ty zrób tak, jak uważasz za stosowne :-)


CR
no wedlug mnie prosciej dla mnie byloby jesli nie podal parametru wchodzac do programu i nie podal go w pytaniu, to wychodze z programu, sprobuje to napisac
CR
  • Rejestracja:ponad 5 lat
  • Ostatnio:prawie 4 lata
  • Postów:64
0
Kopiuj
#!/bin/sh
if [ $# != 0 ]; then
  gzip *.$1
else
  echo "Podaj rozszerzenie: "
  read L2
  if [ $L2 !=0 ]; then
  gzip *.$L2
  else
  fi
fi
CR
nie wiem czy dobrze ustalilem warunek, moga was zabolec oczy
Silv
Spacja po !=.
Patryk27
Moderator
  • Rejestracja:prawie 18 lat
  • Ostatnio:prawie 2 lata
  • Lokalizacja:Wrocław
  • Postów:13042
1

Dlaczego w drugiej instrukcji warunkowej przyrównujesz != 0?


CR
  • Rejestracja:ponad 5 lat
  • Ostatnio:prawie 4 lata
  • Postów:64
0

myslalem tez nad sprawdzeniem jak w pierwszym ifie, sam nie do konca wiem jaki warunek przyjac
trzeba sprawdzic czy L2 cos zawiera, wiec moze przy uzyciu #$ ?

Patryk27
Aaa może wpisz w internet sh check if string empty, zamiast zgadywać? ;-)
Silv
Moderator Wiki
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Warszawa
1

Pytanie jest, co zawiera $L2, gdy nic nie zawiera?


CR
  • Rejestracja:ponad 5 lat
  • Ostatnio:prawie 4 lata
  • Postów:64
1

if [ -z "$L2" ]; then ... ?

Patryk27
Moderator
  • Rejestracja:prawie 18 lat
  • Ostatnio:prawie 2 lata
  • Lokalizacja:Wrocław
  • Postów:13042
0

Tak :-)


CR
  • Rejestracja:ponad 5 lat
  • Ostatnio:prawie 4 lata
  • Postów:64
0
Kopiuj
#!/bin/sh
if [ $# != 0 ]; then
  gzip *.$1
else
  echo "Podaj rozszerzenie"
  read L2
  if [ -z "$L2" ]; then
    fi
else 
    gzip *.$L2
fi

tak?

CR
czuje ze cos zle zrozumialem
Silv
Nie czuj, tylko analizuj. ;)
Patryk27
Moderator
  • Rejestracja:prawie 18 lat
  • Ostatnio:prawie 2 lata
  • Lokalizacja:Wrocław
  • Postów:13042
0
Kopiuj
echo "Podaj rozszerzenie"
read L2
if [ ! -z "$L2" ]; then
  gzip *.$L2
fi

Zobacz pozostały 1 komentarz
Patryk27
Ciało instrukcji ("środek" instrukcji warunkowej albo funkcji) nie może być pusty - w takiej sytuacji możesz albo odwrócić warunek (tak jak pokazałem), albo umieścić coś w ciele ifa (np. echo "błąd: nie podano rozszerzenia" && exit 1).
CR
okej lapie, wklepuje to co podpowiedziales i sprawdze
CR
10: Syntax error: end of file unexpected ( expecting "fi" ) - rozumiem ze pewnie gdzies spacje zgubilem
Patryk27
Nie wiem, nie widzę kodu ;-)
Silv
@Patryk27: to co z ciebie za kompilator, że nie potrafisz bez kodu sprawdzić poprawności. :P
CR
  • Rejestracja:ponad 5 lat
  • Ostatnio:prawie 4 lata
  • Postów:64
0
Kopiuj
#!/bin/sh
if [ $# != 0 ]; then
  gzip *.$1
else
  echo "Podaj rozszerzenie"
  read L2
  if [ !  -z "$L2" ]; then
 gzip *.$L2
fi
Patryk27
Moderator
  • Rejestracja:prawie 18 lat
  • Ostatnio:prawie 2 lata
  • Lokalizacja:Wrocław
  • Postów:13042
2

Masz dwa if, lecz tylko jedno fi.


Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.