Nowe posty

xx Problem ze sterownikami. (5)
2024-04-13, 21:25:16
xx Instalacja xfce4 (2)
2024-04-13, 16:20:17
xx Serie kompilacji bez instalacji dla “emerge” w Gentoo (2)
2024-04-08, 18:40:04
xx Plasma 6 w Neonie ssie trochę mniej ... (17)
2024-04-05, 10:03:46
xx Problem z Linux Lite po instalacji (3)
2024-04-03, 14:23:40
xx Jak właczyć num locka przy starcie systemu debian 12? (12)
2024-04-02, 17:43:54
xx Brak dźwieku w systemie. (5)
2024-04-02, 16:13:41
xx Dystrybucja pod HP Omen (7)
2024-03-29, 11:33:05
xx [Poradnik] Wyszukiwanie Sterowników (2)
2024-03-27, 21:08:23
xx Ile pingwinów? (1)
2024-03-27, 08:59:24

Autor Wątek: Instalacja pakietów po kolei  (Przeczytany 9109 razy)

kapio

  • Gość
Instalacja pakietów po kolei
« dnia: 2011-10-14, 19:22:15 »
Witam, chciałbym stworzyć skrypt bash który by wyglądał mniej więcej tak:
Gdy odpalamy skrypt
Czy na pewno chcesz skorzystać ze skryptu? TAK/NIE
-tak
Czy chcesz zainstalować mysql? TAK/NIE
-nie
Baza mysql nie zostanie zainstalowana
Czy chcesz zainstalować nano? TAK/NIE
-tak
{wywołuje się komenda instalująca nano}
apt-get install nano
{po zakończeniu instalacji nano}
Czy chcesz zainstalować apache2? TAK/NIE
-nie
Apache2 nie zostanie zainstalowane.
To już koniec skryptu.
Czy może chcesz go powtórzyć? TAK/NIE
-tak
{i tutaj skrypt od nowa się wykonuje czyli}
Czy chcesz zainstalować mysql? TAK/NIE
Bardzo mało znam Basha dlatego szukałem w internecie pracowałem trochę z kursami Basha, ale nie mogę dojść jak to ma być. Próbowałem trochę z funkcją
if/else
ale nie mogłem nic zdziałać. Dlatego piszę o pomoc, nie chodzi mi o podanie gotowca, lecz jakich funkcji musiałbym użyć?

Offline ultr

  • Users
  • Guru
  • *****
  • Wiadomości: 1177
    • Zobacz profil
Instalacja pakietów po kolei
« Odpowiedź #1 dnia: 2011-10-14, 20:31:02 »
#!/bin/sh
echo -n "Pytanie?"
read odpowiedz
if [ "$odpowiedz" = "tak" ]; then
  ...
else
  ...
fi
while [ "$odpowiedz" = "tak" ]; do
  ...
done
Przydałoby się także nie rozróżniać wielkości znaków:
read odpowiedz
odpowiedz=${ echo "$odpowiedz" | tr '[A-Z]' '[a-z]' }
if [ "$odpowiedz" = "tak" ]; then
...

kapio

  • Gość
Instalacja pakietów po kolei
« Odpowiedź #2 dnia: 2011-10-14, 20:59:03 »
Dzięki Wielkie! Lecz mam na razie problem, a dokładnie skrypt na razie wygląda tak
#!/bin/sh
#Przykładowy tekst
#Przykładowy tekst2
echo -e "Cos tam cos tam cos tam. \\nChcesz? Tak/Nie"
read odpowiedz
odpowiedz=${ echo "$odpowiedz" | tr '[A-Z]' '[a-z]' }
if [ "$odpowiedz" = "tak" ]; then
apt-get install rar
else
echo -e "nie"
fi
I gdy go odpalę i wcisnę np. "nie" to dostaje
t.sh: line 6: ${ echo "$odpowiedz" | tr '[A-Z]' '[a-z]' }: bad substitution

  • Gość
Instalacja pakietów po kolei
« Odpowiedź #3 dnia: 2011-10-14, 22:52:18 »
Ponieważ te nawiasy nie powinny być klamrowe, tylko zwyczajne, okrągłe. Wtedy będzie działać.

Swoją drogą, niektóre powłoki (konkretnie dash) mają wbudowane polecenie echo, które nie obsługuje flagi -e. Najlepiej uruchamiać /bin/echo, które obsługę takiej flagi ma. Chociaż w tym przypadku równie dobrze można by było tę flagę wywalić, i tak nic nie zmienia.

Zaś zamiast linijki z tr, równie dobrze można warunek skonstruować tak:
if echo "$odpowiedz" |grep -i 'tak'; then

kapio

  • Gość
Instalacja pakietów po kolei
« Odpowiedź #4 dnia: 2011-10-14, 23:12:38 »
Dzięki Wielkie! Działa, ale teraz mam problem ponieważ gdy powinno zapytać o kolejny pakiet to dostaje tylko echo i tyle.
#!/bin/sh
#Przykładowy tekst
#Przykładowy tekst2
echo -e "Cos tam cos tam cos tam. \\nChcesz? Tak/Nie"
read odpowiedz
odpowiedz=$( echo "$odpowiedz" | tr '[A-Z]' '[a-z]' )
if [ "$odpowiedz" = "tak" ]; then
apt-get install rar
else
echo -e "Pakiet"
fi
echo -e "co? tak/nie"
if echo "$odpowiedz" |grep -i 'tak'; then
apt-get install bzip2
else
echo -e "po co?"
fi
Nie pyta o 2 pakiet tyle kończy skrypt. Oraz pytanie do pętli While, co mam wpisać, aby skrypt był wykonany ponownie? Szukałem w internecie, ale nie ma nic na ten temat.

Ps. @UP, co do flagi -e to jest ona potrzebna, aby skrypt czytał \\n ponieważ bez flagi -e nie robi nowej linii.

  • Gość
Instalacja pakietów po kolei
« Odpowiedź #5 dnia: 2011-10-15, 00:15:08 »
Cytat: kapio
ale teraz mam problem ponieważ gdy powinno zapytać o kolejny pakiet to dostaje tylko echo i tyle.
Ponieważ musisz jeszcze raz zapytać użytkownika o dane wejściowe przy pomocy polecenia read.

Cytat: kapio
Oraz pytanie do pętli While, co mam wpisać, aby skrypt był wykonany ponownie?
Tobie jest raczej potrzebna pętla for, do wykonywania identycznego kodu dla iluś tam pakietów.
Pętla while (a raczej jej bliźniak, pętla until) jest Ci potrzebna co najwyżej do tego, żeby prosić użytkownika o dane wejściowe tak długo, aż nie odpowie tak/nie. W języku naturalnym będzie brzmiało to tak:

Dopóki dane wprowadzone przez użytkownika nie równają się "tak" albo "nie":
   proś o dane wejściowe

jeżeli dane wprowadzone równają się "tak"
   zainstaluj pakiet
w przeciwnym wypadku
   wyświetl informację, że pakiet nie zostanie zainstalowany
Teraz musisz tylko przepisać to na język powłoki.

Cytat: kapio
Ps. @UP, co do flagi -e to jest ona potrzebna, aby skrypt czytał \\n ponieważ bez flagi -e nie robi nowej linii.
Można zrobić to na dwa sposoby:
echo "Cos tam cos tam cos tam.
Chcesz? Tak/Nie"
echo "Cos tam cos tam cos tam."
echo "Chcesz? Tak/Nie"
Oba są raczej tak samo dobre, chociaż ten drugi niektórzy mogą uznać za bardziej czytelny. No i w przypadku tego drugiego możesz być pewien, że wszystkie możliwe powłoki i systemy będą zachowywać się tak samo.

kapio

  • Gość
Instalacja pakietów po kolei
« Odpowiedź #6 dnia: 2011-10-15, 00:29:51 »
Dzięki Wielkie jeszcze raz już działa normalnie, została mi pętla for jak sobie nie poradzę to napiszę jaki mam problem. Co do sposobów echo działa :), ale mógłbyś mi wytłumaczyć czemu nie stosować -e? Ponieważ chciałbym pokolorować pytania więc muszę dać -e.

  • Gość
Instalacja pakietów po kolei
« Odpowiedź #7 dnia: 2011-10-15, 10:49:06 »
Tu nie chodzi o samo nie stosowanie echo -e.

W Shebangu swojego skryptu określasz, że ma on być wykonywany przez program /bin/sh. Powłoka Bourne'a, której plik binarny miał taką właśnie ścieżkę, już od dawna nie jest używana; chyba wszystkie Uniksowate z XXI wieku mają tam dowiązanie symboliczne do domyślnej powłoki systemu. Często jest to bash, ale czasem zsh (grml), dash (Debian) czy ksh (niektóre BSD).

echo jest programem używanym na tyle często, że większość powłok posiada wbudowane polecenie o takiej właśnie nazwie. Wbudowane polecenie zawsze ma pierwszeństwo nad plikiem binarnym (znajdującym się gdzieś w $PATH). Tyle że różne powłoki w różny sposób implementują to polecenie. I tak bash domyślnie niektóre sekwencje (jak \\n) traktuje jak zwykłe znaki, chyba że wbudowane polecenie echo zostanie uruchomione z flagą -e. Zresztą GNU echo (to dostępne pod /bin/echo) zachowuje się dokładnie tak samo. Z kolei wbudowane polecenie echo powłoki dash niektóre sekwencje (m.in. \\n) domyślnie traktuje jak znaki specjalne. To polecenie nie zna flagi -e, więc traktuje je jako pierwszy argument polecenia echo. W rezultacie Twój skrypt uruchomiony na zupełnie standardowym Debianie będzie pokazywał:
-e Cos tam cos tam cos tam.
Chcesz? Tak/Nie
Aby temu przeciwdziałać, możesz:
1. Zapomnieć o fladze -e, nowe wiersze wymuszać uruchamiając wielokrotnie polecenie echo, odpuścić sobie kolorowanie wyjścia (które i tak nie wszystkie powłoki obsługują).

2. Uruchamiać /bin/echo zamiast echo -- wtedy sekwencje jak \\n będą odpowiednio interpretowane, ale pozostaje kwestia kolorowania.

3. Zmienić shebang żeby zamiast /bin/sh uruchamiał /bin/bash. Wtedy możesz kolorować wyjście i stosować sekwencje takie jak \\n przy echo uruchomionym z flagą -e. Ale zwróć uwagę, że niektórym potencjalnym użytkownikom ten skrypt w ogóle się nie uruchomi, jeżeli nie mają oni zainstalowanej powłoki bash (nawet nie wszystkie Linuksy mają, o innych uniksowatych nie wspominając). Oczywiście dużo większym problemem jest to, że chcesz używać w skrypcie apt-get, co tak naprawdę oznacza że Twój skrypt jest pisany z myślą o pewnej konkretnej kategorii użytkowników. Pewnie możesz założyć że wszyscy oni mają zainstalowaną powłokę bash, więc zmiana shebanga jest bezpieczna. Ale warto wiedzieć z czym to się wiąże, aby była to decyzja przemyślana.

A skoro dopiero uczysz się programowania skryptów powłoki, to od razu trzy artykuły które powinieneś przeczytać i wziąć sobie do serca (dwa pierwsze po angielsku):
http://mywiki.wooledge.org/BashPitfalls
http://partmaps.org/era/unix/award.html
http://minio.jogger.pl/2009/11/21/popularne-bledy-popelniane-podczas-pisania-skryptow-powloki/

kapio

  • Gość
Instalacja pakietów po kolei
« Odpowiedź #8 dnia: 2011-10-15, 12:18:45 »
Dzięki za wytłumaczenie, co do skryptu to on będzie wykorzystywany przez użytkowników Debian Lenny 5.0 i może przez Ubuntu (tego nie wiem). Jest tam komenda apt-get więc żaden system nie wykorzysta go. Bezpieczniej będzie użyć #!/bin/bash tak? A Ubuntu zareaguje tak samo jak Debian na ten skrypt (#!/bin/bash) czyli przejście do nowej lini/kolorowy tekst czy jednak nie?

  • Gość
Instalacja pakietów po kolei
« Odpowiedź #9 dnia: 2011-10-15, 13:09:03 »
Cytat: kapio
będzie wykorzystywany przez użytkowników Debian Lenny 5.0
Debian 5.0 zostanie porzucony przez twórców Debiana w okolicach lutego 2012 roku. Lepiej zaktualizować system do Squeeze (6.0) póki jeszcze jest czas. Squeeze będzie wspierany do ok. pierwszej połowy 2014 roku (może dłużej).

Cytat: kapio
Bezpieczniej będzie użyć #!/bin/bash tak?
Jeżeli potrzebujesz kolorowania, to tak. Jeżeli potrzebujesz samej flagi -e, to alternatywne rozwiązania masz w moim poprzednim poście. Przy czym dla samego nowego wiersza nie potrzebujesz flagi -e, o czym wspominałem wyżej.

bash ma w Debianie status essential, co oznacza że właściwie nie da się mieć Debiana bez zainstalowanego basha (na potrzeby chwili przyjmijmy takie nie do końca prawdziwe uproszczenie). Nie wiem jak w Ubuntu, ale spodziewam się że podobnie. Czyli jeżeli skrypt jest dla użytkowników Debiana, możesz w shebangu dać /bin/bash i będzie działać.

Cytat: kapio
A Ubuntu zareaguje tak samo jak Debian na ten skrypt (#!/bin/bash) czyli przejście do nowej lini/kolorowy tekst czy jednak nie?
bash to bash. Możesz śmiało założyć, że jest taki sam niezależnie od dystrybucji (Debian, Ubuntu, Fedora, Slackware, Arch, Gentoo, cokolwiek). Co prawda istnieją pewne subtelne różnice (związane głównie z tym, że różne dystrybucje mają różne wersje basha, czasem dodatkowo połatane), ale masz jeszcze czas, żeby się z nimi oswoić. Na chwilę obecną możesz uznać że każdy bash jest taki sam.

kapio

  • Gość
Instalacja pakietów po kolei
« Odpowiedź #10 dnia: 2011-10-15, 13:47:04 »
Jeszcze raz dzięki Wielkie. Co do aktualizacji jest mi lepiej na Debian 5.0 i na razie nie będę go zmieniał. Skrypty mam już napisane, tylko została jeszcze ta pętla ponieważ jak jest pytanie i jeśli użytkownik napiszę np. 1 (lub obojętnie co oprócz tak) to skrypt przyjmuje to jako "nie". A chciałbym, aby pytało cały czas, aż do czasu jak user wpiszę Tak/nie jak wpiszę co innego pytanie się ponowi. Mógłby ktoś pomóc?

  • Gość
Instalacja pakietów po kolei
« Odpowiedź #11 dnia: 2011-10-15, 14:16:36 »
Cytat: kapio
A chciałbym, aby pytało cały czas, aż do czasu jak user wpiszę Tak/nie jak wpiszę co innego pytanie się ponowi. Mógłby ktoś pomóc?
Przeczytaj jeszcze raz szósty post w tym temacie. Jeżeli nadal sobie nie radzisz, to pokaż chociaż kod, który do tej pory stworzyłeś.

kapio

  • Gość
Instalacja pakietów po kolei
« Odpowiedź #12 dnia: 2011-10-15, 14:47:52 »
Pętli for nie mogę zrozumieć, dlatego zacząłem szukać pętle while jak polecono w 2 poście i znalazłem coś takiego
#!/bin/bash 

while [ 1 ]
do
echo -n "Podaj haslo: "
read haslo
if [ "$haslo" = "tajne" ]
then
echo "Prawidlowe haslo"
break # wyjscie z petli
else
echo "Dostep zabroniony"
continue # kolejne przejscie petli
fi
done
Tylko tutaj jest problem ponieważ kod czyta tylko odpowiedź "tak", jeśli wpiszemy nie to on dalej się powtarza. Usunąłem continue i break, ale dalej to samo.

  • Gość
Instalacja pakietów po kolei
« Odpowiedź #13 dnia: 2011-10-15, 19:15:23 »
Nie wiem z jakiego poradnika korzystasz, ale jeżeli z niego skopiowałeś kod powyżej, to lepiej poszukaj czegoś innego. Powyższy kod powinien wyglądać np. tak:
#!/bin/bash
until [ "$haslo" = "tajne" ]; do
        if [ ! -z "$haslo" ]; then
                echo "Dostęp zabroniony"
        fi
        echo -n "Podaj hasło: "
        read haslo
done

echo "Prawidłowe hasło"
Pętla for jest banalna. Konstrukcja:
 for ZMIENNA in ARGUMENTY; do 
   ...
done
Dla każdego z ARGUMENTY (ich liczba jest ograniczona, ale wynosi chyba kilkanaście tysięcy, więc możesz uznać, że jest nieograniczona) wykonuje jakiś kod, gdzie w miejsce ZMIENNA zostanie wstawiony aktualny ARGUMENT. Najprostszy możliwy kod:
for liczba in raz dwa trzy cztery; do echo "$liczba"; done
Jeżeli zaś chodzi o Twój problem:
1. potrzebujesz pętli for, ponieważ chcesz taki sam kod wykonać dla mysql, apache2, nano i może czegoś tam jeszcze.
2. potrzebujesz pętli while/until, ponieważ chcesz prosić użytkownika o dane wejściowe tak długo, aż nie będą miały pewnego konkretnego formatu.
3. po ostatnim przebiegu chcesz zapytać użytkownika, czy chce całą operację wykonać jeszcze raz. Możesz wtedy albo wykonać swój skrypt ponownie (co jest mało czytelnym rozwiązaniem), albo cały kod zamieścić w funkcji, która będzie wywoływana pod odpowiednim warunkiem z wnętrza tej funkcji (funkcja rekurencyjna).

Szkielet kodu, który chcesz wykonywać, mieści się w około 20 linijkach.

Może weź kartkę papieru i narysuj sobie schemat blokowy co i kiedy ma się odbywać w Twoim skrypcie. Jak już będziesz miał taki algorytm na papierze, jego przetłumaczenie na język powłoki powinno być znacznie prostsze (bo to kwestia znalezienia odpowiednich konstrukcji, które masz opisane w każdym poradniku).

kapio

  • Gość
Instalacja pakietów po kolei
« Odpowiedź #14 dnia: 2011-10-16, 17:04:05 »
Dzięki nad tym wyżej już pracuje, co do schematu już mam. Ale teraz mam problem ponieważ napisałem skrypt i on najpierw pyta o dane, a potem tworzy plik i je tam wkleja. Tylko że tam nie które dane są w
"dane"
a ja mam zrobione tak
echo 'costam "$dane"' >> $site
i do pliku wkleja tak
costam "$dane"
I teraz pytanie jak zrobić, aby np. znak
`
zamieniać na ten znak
"
Ponieważ wtedy by normalnie wpisało do pliku, oraz zamieniło się na prawidłowy znak.


Edit:
Już sobie poradziłem :) Wpisałem tak
echo "costam "$mail"" >> $site
I normalnie działa myślałem że gdy będzie drugi " to echo się zamknie.

Edit2:
A jednak źle ponieważ wtedy dodaje do pliku tak
costam dane
a musi być tak
costam "dane"