Nowe posty

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

  • Gość
Instalacja pakietów po kolei
« Odpowiedź #15 dnia: 2011-10-16, 22:20:42 »
Cytat: kapio
echo 'costam "$dane"' >> $site
i do pliku wkleja tak
costam "$dane"
Apostrof (') oznacza "wszystko od tego znaku aż do następnego pojedynczego znaku ma być traktowane po prostu, bez interpretacji przez powłokę". Znak dolara wskazuje powłoce, że ma do czynienia ze zmienną, ale ponieważ jest on w części ujętej w apostrofy, traci swoje specjalne znaczeni -- powłoka traktuje go jako znak bez żadnego znaczenia. Podobnie jest z wykrzyknikiem czy innymi znakami zarezerwowanymi przez powłokę (por. "DEFINITIONS" i "SHELL GRAMMAR" w man bash).

Cytat: kapio
echo "costam "$mail"" >> $site
I normalnie działa myślałem że gdy będzie drugi " to echo się zamknie.
echo się nie zamknie, ale w tej chwili zmienna $mail nie jest traktowana jako jeden ciąg znaków. W tym wypadku nie ma to większego znaczenia, ale gdyby to było polecenie rm albo mv, konsekwencje mogłyby być opłakane.

Cytat: kapio
A jednak źle ponieważ wtedy dodaje do pliku tak
costam dane
a musi być tak
costam "dane"
Musisz zacytować znak cudzysłowu, poprzedzając go odwróconym ukośnikiem. W ten sposób powiesz powłoce, że następny znak ma być potraktowany dosłownie, bez nadawania mu specjalnego znaczenia.

Np.
echo costam & # przeniesie proces wyświetlania "costam" do podpowłoki w tle. Akurat ten przykład nie ma większego sensu, ale chodzi o logikę działania
echo costam \\& # wyświetli "costam &"
echo costam '&' # jw.
W tym przypadku możesz też zapisać tak:
echo costam '"'"$mail"'"'
ale nie jest to specjalnie czytelny zapis. Po prostu cudzysłowy, mające specjalne znaczenie dla powłoki, umieszczasz w apostrofach, które to specjalne znaczenie im odbierają.

Offline roobal

  • Users
  • Guru
  • *****
  • Wiadomości: 2056
    • Zobacz profil
Instalacja pakietów po kolei
« Odpowiedź #16 dnia: 2011-10-16, 22:40:24 »
Może coś w tym stylu?

#!/bin/bash

pakiet1() {
echo  -ne "\\nZainstalować pakiet1 - tak/nie: "
read odp

if [ $odp = "tak" ]; then
apt-get -s install pakiet1
else
echo "Pakiet nie zostanie zainstalowany."
fi
}

pakiet2() {
echo -ne "\\nZainstalować pakiet2 - tak/nie: "
read odp

if [ $odp = "tak" ]; then
apt-get -s install pakiet2
else
echo "Pakiet nie zostanie zainstalowany."
fi
}

pakiet3() {
echo  -ne "\\nZainstalować pakiet3 - tak/nie: "
read odp

if [ $odp = "tak" ]; then
apt-get -s install pakiet3
else
echo "Pakiet nie zostanie zainstalowany."
fi
}

pakiet4() {
echo -ne "\\nZainstalować pakiet4 - tak/nie: "
read odp

if [ $odp = "tak" ]; then
apt-get -s install pakiet4
else
echo "Pakiet nie zostanie zainstalowany."
fi
}

menu() {
echo -e "\\n1. Zainstluj pakiet1"
echo "2. Zainstaluj pakiet2"
echo "3. Zainstaluj pakiet3"
echo "4. Zainstaluj pakiet4"
echo "5. Zakończ działanie skryptu."
echo -ne "\\nWybierz co chcesz zrobić: "
read odp
clear

case $odp in

"1") pakiet1 menu; sleep 2; clear ;;
"2") pakiet2 menu; sleep 2; clear ;;
"3") pakiet3 menu; sleep 2; clear ;;
"4") pakiet4 menu; sleep 2; clear ;;
"5") exit 0 ;;
*) echo "Niewłaściwa opcja!"; sleep 2; clear ;;
esac
menu
}

clear
echo -ne "\\n\\nTutaj może zostać wyświetlony tekst powitalny oraz informujący do czego służy skrypt oraz ewentualnie informacja o autorze skryptu i jego licencji. Aby przejść dalej proszę wcisnąć klawisz ENTER."

read
clear
menu
Pozdrawiam!

kapio

  • Gość
Instalacja pakietów po kolei
« Odpowiedź #17 dnia: 2011-10-16, 22:56:02 »
Minio, dzięki Wielkie działa :)
roobal, dzięki Wielkie również, lecz gdy wpiszę "nie" dostaje "nie właściwa odpowiedź" co trochę nie jest mi na rękę. Dlatego dzięki ale z Twojego skryptu nie skorzystam (no komendę clear do swoich dodam więc dzięki za coś :)). A nie skorzystam dlatego że mój skrypt ma iść ciągle, a w Twoim 1 pakiet - 1 wybór. A takie pytanie ponieważ mój skrypt składa się z 5 plików .sh a dało by się to wszystko wklepać do Twojego? Czyli np. wybieram opcję 1 i idzie wszystko po kolei czyli:
Wybierz pakiet:
-Wybrano pakiet 1
chcesz to zainstalować? tak/nie
tak
instaluje się pakiet
chcesz to zainstalować {2}? tak/nie
nie
nie instaluje pakietu
chcesz to zainstalować {3}? tak/nie
tak
instaluje pakiet
pakiet był ostatni
echo Wszystkie pakiety zostały zainstalowane wciśnij enter, aby powrócić do wyboru instalacji
Wybierz pakiet:
wybrano pakiet
i znowu cos się instaluje
Pytam się bo aż tak dobry w bashu nie jestem i muszę bardzo mocno przeanalizować Twój skrypt :) No, a wiadomo lepiej wszystko w 1 niż 5.

Edit: Co do tego echo to mam 1 mały problem, a dokładniej kod wygląda tak
echo    > $site
I dostaje taki błąd
Directory: No such file or directory
I ta linijka się nie dodaje, a znak < musi być.

Offline roobal

  • Users
  • Guru
  • *****
  • Wiadomości: 2056
    • Zobacz profil
Instalacja pakietów po kolei
« Odpowiedź #18 dnia: 2011-10-16, 23:09:12 »
Poprawiłem skrypt, zmieniłem interpreter poleceń z /bin/sh na /bin/bash, gdyż Bash źle interpretował polecenia echo.

Cytat: kapio
roobal, dzięki Wielkie również, lecz gdy wpiszę "nie" dostaje "nie właściwa odpowiedź" co trochę nie jest mi na rękę.
Nie powinno tak się dziać, przez publikacją testowałem kilka razy skrypt.

Cytuj
A nie skorzystam dlatego że mój skrypt ma iść ciągle, a w Twoim 1 pakiet - 1 wybór.
Nie powinno tak być, skrypt powinien się zapętlać do czasu, aż nie wybierzesz opcji nr 5 lub do czasu, aż nie wciśniesz klawiszy ctrl+c. Poprawiłem lekko kod, przetestuj skrypt jeszcze raz i ewentualnie napisz, gdzie dokładnie coś nie działa.

Wklejam na  nowo
#!/bin/bash

pakiet1() {
echo  -ne "\\nZainstalować pakiet1 - tak/nie: "
read odp

if [ $odp = "tak" ]; then
apt-get -s install pakiet1
else
echo "Pakiet nie zostanie zainstalowany."
fi
}

pakiet2() {
echo -ne "\\nZainstalować pakiet2 - tak/nie: "
read odp

if [ $odp = "tak" ]; then
apt-get -s install pakiet2
else
echo "Pakiet nie zostanie zainstalowany."
fi
}

pakiet3() {
echo  -ne "\\nZainstalować pakiet3 - tak/nie: "
read odp

if [ $odp = "tak" ]; then
apt-get -s install pakiet3
else
echo "Pakiet nie zostanie zainstalowany."
fi
}

pakiet4() {
echo -ne "\\nZainstalować pakiet4 - tak/nie: "
read odp

if [ $odp = "tak" ]; then
apt-get -s install pakiet4
else
echo "Pakiet nie zostanie zainstalowany."
fi
}

menu() {
echo -e "\\n1. Zainstluj pakiet1"
echo "2. Zainstaluj pakiet2"
echo "3. Zainstaluj pakiet3"
echo "4. Zainstaluj pakiet4"
echo "5. Zakończ działanie skryptu."
echo -ne "\\nWybierz co chcesz zrobić: "
read odp
clear

case $odp in

"1") pakiet1 menu; sleep 2; clear ;;
"2") pakiet2 menu; sleep 2; clear ;;
"3") pakiet3 menu; sleep 2; clear ;;
"4") pakiet4 menu; sleep 2; clear ;;
"5") exit 0 ;;
*) echo "Niewłaściwa opcja!"; sleep 2; clear ;;
esac
menu
}

clear
echo -ne "\\n\\nTutaj może zostać wyświetlony tekst powitalny oraz informujący do czego służy skrypt oraz ewentualnie informacja o autorze skryptu i jego licencji. Aby przejść dalej proszę wcisnąć klawisz ENTER."

read
clear
menu
Pozdrawiam!

Offline roobal

  • Users
  • Guru
  • *****
  • Wiadomości: 2056
    • Zobacz profil
Instalacja pakietów po kolei
« Odpowiedź #19 dnia: 2011-10-16, 23:14:46 »
W skróci skrypt działa tak:

1. Określanie funkcji (funkcje pakiet1, pakiet2, pakiet3, pakiet4 i menu), w których zawarte są konkretne polecenia
2. Funkcja menu, tworzy menu przy pomocy instrukcji case, które wywołuje funkcje pakiet1 - pakiet4 oraz menu (zapętlenie - powrót do menu)
3. W pierwszej kolejności wykonywany jest kod pod funkcjami, czyli kod

clear
echo -ne "\\n\\nTutaj może zostać wyświetlony tekst powitalny oraz informujący do czego służy skrypt oraz ewentualnie informacja o autorze skryptu i jego licencji. Aby przejść dalej proszę wcisnąć klawisz ENTER."

read
clear
potem wykonywana jest funkcja menu, która dalej wykonuje resztę kodu.

Pozdrawiam!

kapio

  • Gość
Instalacja pakietów po kolei
« Odpowiedź #20 dnia: 2011-10-16, 23:16:50 »
Teraz działa gdy wpiszę nie, a co do tych pakietów to mi chodzi że np. opcja 1 ma w sobie 10 pod opcji czyli jak wybiorę opcję 1 która odpowiada za apache2, mysql i na początku spyta nas o apache2 my wciśniemy tak to on go zainstaluje i po instalacji zapyta nas o mysql i jeśli wybierzemy tak to on go zainstaluje i dopiero wtedy wyrzuci nas do wyboru pozostałych opcji. Ponieważ aktualnie jest że jak uruchomię skrypt -> wybiorę 1 to on mi zainstaluje pakiet 1 i po instalacji danego pakietu wyrzuca do menu wyboru, a opcja 1 ma mieć jeszcze pod opcję. Czyli tak:
Wybrałem opcję: 1
Chcesz zainstalować pakiet apache2? Tak/nie
{tak}
{instaluje pakiet apache2}
Chcesz zainstalować mysql? Tak/nie
{tak}
{instaluje pakiet mysql}
I dopiero teraz wyrzuca nas do menu wyboru
a u Ciebie jest tak
Wybrałem opcję: 1
Chcesz zainstalować pakiet apache2? Tak/nie
{tak}
{instaluje pakiet apache2}
Wyrzuca mnie do menu wyboru

Offline roobal

  • Users
  • Guru
  • *****
  • Wiadomości: 2056
    • Zobacz profil
Instalacja pakietów po kolei
« Odpowiedź #21 dnia: 2011-10-16, 23:18:59 »
Czyli musiałbyś po prostu rozbudować skrypt wedle własnego uznania, kod który podałem to tylko propozycja, niestety ja muszę już znikać z komputera, więc dzisiaj więcej nie pomogę.

Pozdrawiam!

kapio

  • Gość
Instalacja pakietów po kolei
« Odpowiedź #22 dnia: 2011-10-16, 23:20:14 »
Dobrze, tutaj nie chodzi o to, abyś napisał mi skrypt tylko czy takie coś jest możliwe w Twoim skrypcie. Dzięki Wielkie idę próbować to zrobić.

Edit: Już działa :) Teraz tylko został mi ten problem z echo.

Offline roobal

  • Users
  • Guru
  • *****
  • Wiadomości: 2056
    • Zobacz profil
Instalacja pakietów po kolei
« Odpowiedź #23 dnia: 2011-10-16, 23:25:34 »
Możesz to zrobić też po prostu tak

#!/bin/bash

pakiet1() {
echo  -ne "\\nZainstalować Apache - tak/nie: "
read odp

if [ $odp = "tak" ]; then
apt-get -s install apache2
else
echo "Pakiet nie zostanie zainstalowany."
fi
sleep 2

echo  -ne "\\nZainstalować MySQL - tak/nie: "
read odp

if [ $odp = "tak" ]; then
apt-get -s install mysql-server
else
echo "Pakiet nie zostanie zainstalowany."
fi

}

pakiet2() {
echo -ne "\\nZainstalować pakiet2 - tak/nie: "
read odp

if [ $odp = "tak" ]; then
apt-get -s install pakiet2
else
echo "Pakiet nie zostanie zainstalowany."
fi
}

pakiet3() {
echo  -ne "\\nZainstalować pakiet3 - tak/nie: "
read odp

if [ $odp = "tak" ]; then
apt-get -s install pakiet3
else
echo "Pakiet nie zostanie zainstalowany."
fi
}

pakiet4() {
echo -ne "\\nZainstalować pakiet4 - tak/nie: "
read odp

if [ $odp = "tak" ]; then
apt-get -s install pakiet4
else
echo "Pakiet nie zostanie zainstalowany."
fi
}

menu() {
echo -e "\\n1. Zainstluj pakiet1"
echo "2. Zainstaluj pakiet2"
echo "3. Zainstaluj pakiet3"
echo "4. Zainstaluj pakiet4"
echo "5. Zakończ działanie skryptu."
echo -ne "\\nWybierz co chcesz zrobić: "
read odp
clear

case $odp in

"1") pakiet1 menu; sleep 2; clear ;;
"2") pakiet2 menu; sleep 2; clear ;;
"3") pakiet3 menu; sleep 2; clear ;;
"4") pakiet4 menu; sleep 2; clear ;;
"5") exit 0 ;;
*) echo "Niewłaściwa opcja!"; sleep 2; clear ;;
esac
menu
}

clear
echo -ne "\\n\\nTutaj może zostać wyświetlony tekst powitalny oraz informujący do czego służy skrypt oraz ewentualnie informacja o autorze skryptu i jego licencji. Aby przejść dalej proszę wcisnąć klawisz ENTER."

read
clear
menu
Być może jest lepszy sposób, ale jak już pisałem, znikam z komputera ;)

Pozdrawiam!

  • Gość
Instalacja pakietów po kolei
« Odpowiedź #24 dnia: 2011-10-17, 00:05:09 »
Proszę, jeżeli już próbujemy uczyć, to od razu dobrych praktyk. Jak pisałem, podstawowa struktura skryptu jest do zmieszczenia w 20 linijkach:
#!/bin/sh
f() {
        for pkg in apache2 mysql nano end; do
                unset odp
                until echo "$odp" |grep -i -q '^[tn]'; do
                        [ "$pkg" = "end" ] && echo -n "Czy chcesz ponownie uruchomić skrypt?" || echo -n "Czy chcesz zainstalować ${pkg}?"
                        echo -n " [T/N]: "
                        read odp
                done
                case "$odp" in
                        [tT]* )
                                [ "$pkg" != "end" ] && echo "Instaluję $pkg" || f
                                ;;
                        [nN]* )
                                [ "$pkg" != "end" ] && echo "Pakiet $pkg nie zostanie zainstalowany"
                                ;;
                esac
        done
}
f
Chciałem uniknąć podawania gotowego rozwiązania, ale wobec kodu takiej jakości nie mogę nie interweniować.

Do tworzenia menu (tak jak proponuje roobal) lepiej jest użyć whiptail albo bashyzmu w postaci pętli select.

Offline roobal

  • Users
  • Guru
  • *****
  • Wiadomości: 2056
    • Zobacz profil
Instalacja pakietów po kolei
« Odpowiedź #25 dnia: 2011-10-17, 15:07:02 »
Wiem, że mój kod nie jest idealny i pisałem, że pewnie jest lepsze rozwiązanie, skrypt był zwyczajnie pisany na szybko i miał być bardziej propozycją jedną z wielu, niż gotowym rozwiązaniem ;)

Pozdrawiam!