szymon170 Temat założony przez niniejszego użytkownika |
Jak wpisać case w case w bashu? » 2016-03-28 16:44:55 Witam. Chciałbym wpisać case do case w bashu. Gdy jednak tak zrobię, to wyskakuje mi taki błąd:
./sdl-2.0.4.sh: linia 56: błąd składni przy nieoczekiwanym znaczniku `)' ./sdl-2.0.4.sh: linia 56: ` [Nn]* ) read -p "Dobrze, skrypt zostanie zakończony"; exit;;'
Tworzę przykładowy skrypt który sam ściągnie i skompiluje program (w tym przypadku sdl). Korzystam z Linuxa, i gdyby takich skryptów było więcej na Linuxie to potrzeba sprawdzania jak skompilować jakiś program byłaby zbędna.
Cały przebieg tego co się dzieje po uruchomieniu programu:
./sdl-2.0.4.sh Czy chcesz ściągnać, skompilować i zainstalować SDL2-2.0.4? t - tak n - nie wpisz t lub n t ./sdl-2.0.4.sh: linia 56: błąd składni przy nieoczekiwanym znaczniku `)' ./sdl-2.0.4.sh: linia 56: ` [Nn]* ) read -p "Dobrze, skrypt zostanie zakończony"; exit;;'
lub
./sdl-2.0.4.sh Czy chcesz ściągnać, skompilować i zainstalować SDL2-2.0.4? t - tak n - nie wpisz t lub n n ./sdl-2.0.4.sh: linia 60: błąd składni przy nieoczekiwanym znaczniku `)' ./sdl-2.0.4.sh: linia 60: ` [Nn]* ) read -p "Dobrze, skrypt zostanie zakończony"; exit;;'
lub
./sdl-2.0.4.sh Czy chcesz ściągnać, skompilować i zainstalować SDL2-2.0.4? t - tak n - nie wpisz t lub n z ./sdl-2.0.4.sh: linia 60: błąd składni przy nieoczekiwanym znaczniku `)' ./sdl-2.0.4.sh: linia 60: ` [Nn]* ) read -p "Dobrze, skrypt zostanie zakończony"; exit;;'
Próbowałem jakoś poprawić ten kod, ale i tak były błędy. Plan działania programu:
1. Program pisze instrukcje jak działa i co trzeba napisać 2. Program prosi o odpowiedź: 2a. Jeśli odpowiedź to t to program przechodzi dalej i instaluje program oraz wyświetla powiadomienie: 2a-1. Jeśli znów odpowiemy t (chcemy zainstalować checkinstall) to program instaluje się wraz z programem checkinstall 2a-2. Jeśli odpowiemy n to program zainstaluje się bez użycia checkinstall 2b. Jeśli odpowiemy n to program się nie zainstaluje 3. Program się zamyka.
Jak mogę ten kod poprawić by case w case działał? Zdaje mi się że to stosowny temat na te forum, ponieważ twórca C stworzył też basha, a poza tym nie znam polskiego forum o programowaniu w bashu, a te forum jest też o innych językach programowania. Nie zrozumcie mnie źle - nie chcę by ktoś za mnie zrobił taki program, tylko chcę, by ktoś wskazał mi błąd w tym jak napisałem ten program i wskazał, jak można taki błąd poprawić.
Kod źródłowy:
#!/bin/bash echo "Czy chcesz ściągnać, skompilować i zainstalować SDL2-2.0.4?" echo "t - tak" echo "n - nie" printf "wpisz t lub n\n" read tn while true; do case $tn in [Tt]* ) read -p "instalacja rozpocznie się po wciśnięciu dowolnego klawisza"; sudo su; mkdir ~/compiled; wget -O ~/compiled https://www.libsdl.org/release/SDL2-2.0.4.tar.gz; cd ~/compiled; tar -zxvf SDL2-2.0.4.tar.gz; cd SDL2-2.0.4; ./configure; make;
while true; do printf "Czy chcesz zainstalować program za pomocą programu checkinstall?" printf "UWAGA! Program ten jest przeznaczony dla użytkowników systemów używających" printf "paczek .deb (np. Debian, Ubuntu, inne systemy *buntu np. Xubuntu, Lubuntu, Kubuntu itp.)." echo printf "Jeśli masz system który nie używa paczek .deb, to odpowiedz n" printf "Jeśli masz system który obsługuje paczki .deb, to odpowiedz t" echo echo printf "Jeśli masz system który obsługuje paczki .deb, ale nie wyrażasz" printf "zgody na instalację dodatkowego programu checkinstall, to odpowiedz n" printf "(nie radzimy odpowiadać n w przypadku gdy masz system obsługujący paczki .deb," printf "ponieważ późniejsze odinstalowywanie programu może być trudne, a program" printf "checkinstall jest zaufany, nie jest ani malware, ani adware, ani wirusem, zajmuje mało" printf "miejsca na dysku, nie spowalnia systemu i nie uruchamia się wraz ze startem systemu)." printf "Checkinstall to tylko narzędzie do instalacji innych programów." printf "Program checkinstall można też później łatwo odinstalować." read yn case $yn in [Tt]* ) sudo apt-get install checkinstall; sudo checkinstall; cd ~/ rm -rf ~/compiled printf "Instalacja się powiodła, program zostanie zakończony po wciśnięciu"; read -p "dowolnego klawisza"; exit;; [Nn]* ) sudo make install; cd ~/ rm -rf ~/compiled printf "Instalacja się powiodła, program zostanie zakończony po wciśnięciu"; read -p "dowolnego klawisza"; exit;; * ) echo "Proszę, odpowiedz t lub n";; esac done
#################################################################### [Nn]* ) read -p "Dobrze, skrypt zostanie zakończony"; exit;; * ) echo "Proszę, odpowiedz t lub n";; esac done
|
|
DejaVu |
» 2016-03-31 13:52:21 Podziel kod na funkcje - będzie łatwiej go czytać, łatwiej utrzymywać i łatwiej rozwijać. |
|
szymon170 Temat założony przez niniejszego użytkownika |
Poprawiony kod źródłowy » 2016-03-31 16:22:26 Poprawiłem kod źródłowy, oznaczyłem go komentarzami i poprawiłem komunikaty (poprawiłem to że checkinstall działa tylko w systemach obsługujących paczki .deb - to nielogiczny komunikat, bo ten instalator jest jak na razie tylko dla takich systemów, więc też do początkowego komunikatu o instalacji dodałem komunikat o tym, że instalator działa tylko w systemach obsługujących paczki .deb i apt-get).
#!/bin/bash #######Pytanie####### echo "Czy chcesz ściągnać, skompilować i zainstalować SDL2-2.0.4?" echo "Uwaga! Ten instalator zadziała tylko z systemami obsługującymi" echo "apt-get install, bash i paczki .deb" echo echo "t - tak" echo "n - nie" printf "wpisz t lub n\n" #######Odpowiedź na pytanie o chęci instalacji####### read tn #######Odpowiedź na pytanie o chęci instalacji####### #######Pytanie####### #######Pętla case nr. 1 (instalacja)####### while true; do case $tn in #######Pobranie programu, kompilacja (odpowiedź na pierwsze pytanie - t)####### [Tt]* ) read -p "instalacja rozpocznie się po wciśnięciu dowolnego klawisza"; sudo su; mkdir ~/compiled; wget -O ~/compiled https://www.libsdl.org/release/SDL2-2.0.4.tar.gz; cd ~/compiled; tar -zxvf SDL2-2.0.4.tar.gz; cd SDL2-2.0.4; ./configure; make; #######Pobranie programu, kompilacja (odpowiedź na pierwsze pytanie - t)####### #######Powiadomienie, pytanie####### while true; do printf "Czy chcesz zainstalować program za pomocą programu chceckinstall?" printf "Program ten służy do instalacji skompilowanego programu dodając" printf "go do paczki .deb, dzięki czemu łatwiej będzie można go" printf "odinstalować. Jeśli jednak nie wyrażasz" printf "zgody na instalację dodatkowego programu checkinstall, to odpowiedz n" printf "(nie radzimy odpowiadać n," printf "ponieważ późniejsze odinstalowywanie programu może być trudne, a program" printf "checkinstall jest zaufany, nie jest ani malware, ani adware, ani wirusem, zajmuje mało" printf "miejsca na dysku, nie spowalnia systemu i nie uruchamia się wraz ze startem systemu)." printf "Checkinstall to tylko narzędzie do instalacji innych programów." printf "Program checkinstall można też później łatwo odinstalować." #######Powiadomienie, pytanie####### #######Odpowiedź na pytanie o instalacji checkinstall####### read yn #######Odpowiedź na pytanie o instalacji checkinstall####### #######Pętla case nr. 2 (instalacja checkinstall, pętla w pętli)####### case $yn in #######Pobranie programu checkinstall, instalacja sdl za pomocą checkinstall (odpowiedź na drugie pytanie - t)####### [Tt]* ) sudo apt-get install checkinstall; sudo checkinstall; cd ~/ rm -rf ~/compiled printf "Instalacja się powiodła, program zostanie zakończony po wciśnięciu"; read -p "dowolnego klawisza"; #######Pobranie programu checkinstall, instalacja sdl za pomocą checkinstall (odpowiedź na drugie pytanie - t)####### #######Wyjście z programu####### exit;; #######Wyjście z programu####### #######Instalacja bez programu checkinstall (odpowiedź na drugie pytanie - n)####### [Nn]* ) sudo make install; cd ~/ rm -rf ~/compiled printf "Instalacja się powiodła, program zostanie zakończony po wciśnięciu"; read -p "dowolnego klawisza"; #######Instalacja bez programu checkinstall (odpowiedź na drugie pytanie - n)####### #######Wyjście z programu####### exit;; #######Wyjście z programu####### #######Powiadomienie o niepoprawnej odpowiedzi na pytanie 2 (pytanie o checkinstall), program powraca do początku pętli nr. 2####### * ) echo "Proszę, odpowiedz t lub n";; #######Powiadomienie o niepoprawnej odpowiedzi na pytanie 2 (pytanie o checkinstall), program powraca do początku pętli nr. 2####### esac done #######Pętla case nr. 2 (instalacja checkinstall, pętla w pętli)####### #################################################################################################################################### #######Zakończenie programu (odpowiedź na pierwsze pytanie - n)####### [Nn]* ) read -p "Dobrze, skrypt zostanie zakończony"; exit;; #######Zakończenie programu (odpowiedź na pierwsze pytanie - n)####### #######Powiadomienie o niepoprawnej odpowiedzi na pytanie 1 (pytanie o instalację), program powraca do początku pętli nr. 1####### * ) echo "Proszę, odpowiedz t lub n";; #######Powiadomienie o niepoprawnej odpowiedzi na pytanie 1 (pytanie o instalację), program powraca do początku pętli nr. 1####### esac done #######Pętla case nr. 1 (instalacja)####### |
|
« 1 » |