Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Jak wpisać case w case w bashu?

Ostatnio zmodyfikowano 2016-03-31 16:22
Autor Wiadomość
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
P-146643
DejaVu
» 2016-03-31 13:52:21
Podziel kod na funkcje - będzie łatwiej go czytać, łatwiej utrzymywać i łatwiej rozwijać.
P-146815
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)#######
P-146825
« 1 »
  Strona 1 z 1