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: Instrukcja case - problem przy wyborze anuluj.  (Przeczytany 10551 razy)

krzysiek486

  • Gość
Instrukcja case - problem przy wyborze anuluj.
« dnia: 2014-01-21, 18:05:50 »
Mam problem przy case. Użyłem okna radiolist. Kiedy wybiorę jakoś opcje, skrypt idzie dalej i do końca nie pokazuje błędu. Problem pojawia się gdy wybiorę anuluj lub nacisnę ESC. Pojawia się komunikat:


dla 0) mam wykonywanie konkretnych zadań z archiwizowaniem.
dla 1) mam echo anuluj.
dla 255) mam echo ESC.

Moim zdaniem w przypadku wyboru jakiejś pozycji i zatwierdzeniu jej powinno wykonywać archiwizację - i tak jest.
W przypadku wyboru Cancel powinien pojawić się komunikat o anulowaniu skryptu.
W przypadku naciśnięcia ESC powinien pojawić się komunikat o opuszczeniu skryptu.
Gdzie mogłem popełnić błąd?

Offline ultr

  • Users
  • Guru
  • *****
  • Wiadomości: 1177
    • Zobacz profil
Instrukcja case - problem przy wyborze anuluj.
« Odpowiedź #1 dnia: 2014-01-21, 18:47:55 »
Nie wiem gdzie mogłeś popełnić błąd, bo nie widzę twojego skryptu.
Zapewne nikt inny na forum też nie ma szklanej kuli.

Offline vanhelzing

  • Users
  • Prawie jak Guru
  • ****
  • Wiadomości: 314
    • Zobacz profil
Instrukcja case - problem przy wyborze anuluj.
« Odpowiedź #2 dnia: 2014-01-21, 22:18:38 »
wybor1=`tar -cf wynik1`
wybor2=`tar -czf wynik2`
wybor3=`tar -cfj wynik3`
Grawis (`) powoduje, że komenda jest wykonywana natychmiast, a jej wynik jest zapisywany do zmiennej wyborX. Dlatego zanim dojdzie do case'a wykonywane są komendy:
tar -cf wynik1
tar -czf wynik2
tar -cfj wynik3
Czyli utworzenie trzech pustych archiwów o nazwach "wynik1", "wynik2" i "wynik3". Stąd informacja, że "tchórzliwie odmawia utworzenia pustego archiwum".

Offline Paweł Kraszewski

  • Administrator
  • Guru
  • *****
  • Wiadomości: 3056
  • Lenistwo jest matką potrzeby = babcią wynalazku
    • Zobacz profil
Instrukcja case - problem przy wyborze anuluj.
« Odpowiedź #3 dnia: 2014-01-22, 07:34:15 »
Zasadniczy problem skryptu to całkowity brak zrozumienia działania polecenia dialog i zarządzania jej wynikami. Jest mnóstwo tutoriali w necie. Przeczytaj, zrozum i popraw pierwszą część skryptu.

Dodatkowo, rozrysuj sobie przepływ sterowania na kartce i porównaj z przepływem w tym skrypcie.

Jak rozumiem - sen zimowy zaczęły przerywać podłe zaliczenia? Człowiek sobie spokojnie poszedł na religioznawstwo ze specjalnością  mezoamerykańską a tu nagle jakiś oszołom w bashu każe programować?
Paweł Kraszewski
~Arch/Void/Gentoo/FreeBSD/OpenBSD/Specjalizowane customy

Offline ultr

  • Users
  • Guru
  • *****
  • Wiadomości: 1177
    • Zobacz profil
Instrukcja case - problem przy wyborze anuluj.
« Odpowiedź #4 dnia: 2014-01-22, 20:04:58 »
0) Używaj znacznika BBCode [ code ] a nie screenshotów.

1) Zamiast --radiolist polecam --menu, bo jest bardziej intuicyjne dla użytkownika

2) Wyboru z dialog-u nie trzeba zapisywać jako plik. Generalnie pisanie do pliku tymczasowego to okropna praktyka, może poza przypadkami obróbki dużej ilości danych, gdy jest to uzasadnione.
wybor=`dialog --stdout --title Archiwizacja --backtitle "Skrypt do archiwizacji" \\
           --radiolist "Wybierz rodzaj archiwizacji:" 10 40 3                    \\
           1 "Bez kompresji" "off"                                               \\
           2 "Z kompresja GZIP" "off"                                            \\
           3 "Z komp..." "off"`
status="$?"
echo "Status: $status Wybor: $wybor"
3) Przy $status-ie 0 zmienną $wybor przepuszczasz przez case i na tej podstawie ustalasz zmienną $opcje:
opcje=''
case "$wybor" in
    '1') opcje='-cf' ;;
    '2') opcje='-czf' ;;
    '3') opcje='-cfj' ;;
esac
i potem używasz ich przy wywołaniu tar-a:
tar $opcje ...
4) Używaj wcięć za pomocą tabulacji lub spacji.

5) Rozumiem, że możesz nie znać składni Basha, ale czemu tworzysz takiego potworka algorytmicznego?

krzysiek486

  • Gość
Instrukcja case - problem przy wyborze anuluj.
« Odpowiedź #5 dnia: 2014-01-23, 18:00:20 »
0) Dodam jeszcze screena, bo lepiej zobrazuje co i jak wygląda :P
1) Bardziej intuicyjne może i tak. Wiele nie zmienia, ale jak już wszystko ogarnę to może rzeczywiście zmienię na menu.

Przy
case "$wybor" in
    '1') opcje='-cf' ;;
    '2') opcje='-czf' ;;
    '3') opcje='-cfj' ;;
pokazuje błąd, ponieważ sytuacja jest podobna do tej z góry. System nie odnajduje poleceń jak np. `-cf`.

Dodam co mam na tę chwilę zrobione. Do dorobienia jest jeszcze okno, gdzie użytkownik będzie mógł wpisać ścieżkę do plików, które chce archiwizować itd.
Jakieś rady co z tym dalej?



Na ostatnie pytanie nie dodałem odpowiedzi.
Muszę przygotować skrypt okienkowy, który nie tylko wyświetla informację czy wyświetla to co wpisze użytkownik. Skrypt ma robić działania na plikach, coś bardziej wymagającego. Wymyśliłem coś takiego myśląc, że pójdzie duużo sprawniej ;/

Offline ultr

  • Users
  • Guru
  • *****
  • Wiadomości: 1177
    • Zobacz profil
Instrukcja case - problem przy wyborze anuluj.
« Odpowiedź #6 dnia: 2014-01-23, 22:39:43 »
"pokazuje błąd, ponieważ sytuacja jest podobna do tej z góry. System nie odnajduje poleceń jak np. `-cf`. "

Nie przeczytałeś co napisał vanhelzing.

Czy ja przy opcjach użyłem (`), czy może (') ?

`...` - wykonuje polecenie ... i zwraca jego output (standardowe wyjście) jako string
$(...) - j.w.
'...$a...\\n...' - string dosłownie
"...$a...\\n..." - string z interpretacją zawartości, np. podstawienie zmiennych, escapowanie znaków

krzysiek486

  • Gość
Instrukcja case - problem przy wyborze anuluj.
« Odpowiedź #7 dnia: 2014-01-27, 13:05:17 »
Zrobiłem jak wyżej i chciałem przetestować.
Zrobiłem 3 pliki - "xd" "xdd" i "xddd". Do każdego z plików dopisałem trochę danych, żeby miały one jakiś rozmiar.
Nazwę archiwum zmieniałem ręcznie, w skrypcie, który wygląda tak:


Dla pierwszych dwóch opcji (bez kompresji i z kompresją GZIP wszystko działa. Widać, że archiwum2 jest skompresowane porównując je z nieskompresowanym archiwum1.


Błąd pojawia się, kiedy w skrypcie nazwę archiwum zmieniam na "archiwum3" i wybieram BZIP2. Wtedy pokazują się błąd. Nie bardzo wiem jaka jest jego przyczyna. Możliwe, że to jakiś banalny błąd w skrypcie, którego nie mogę zlokalizować.

Na koniec pytanie. Jak teraz wstawić tu okienko, żeby to użytkownik mógł podać całą ścieżkę archiwizacji bez ingerencji w skrypt. Wszystko musi odbyć się przy pomocy okienek.

Offline ultr

  • Users
  • Guru
  • *****
  • Wiadomości: 1177
    • Zobacz profil
Instrukcja case - problem przy wyborze anuluj.
« Odpowiedź #8 dnia: 2014-01-27, 16:23:56 »
3) opcje=-cfj ;;
Opcja -f czyli --file oczekuje po sobie nazwy pliku.
I ją dostaje: "j".
A "archiwum3" traktuje jako pierwszy plik do spakowania, który niestety nie istnieje.

man tar

W pozostałych opcjach case jest OK.

krzysiek486

  • Gość
Instrukcja case - problem przy wyborze anuluj.
« Odpowiedź #9 dnia: 2014-01-27, 17:22:09 »
Okej, wystarczyło zamienić "-cfj" na "-cjf".
Jak mam teraz zrobić to przy pomocy skryptów okienkowych. To skrypt ma umożliwić użytkownikami wpisanie ścieżek do archiwizacji bez edycji skryptu.
Gdzie teraz umieścić tar, żeby skrypt nie wysypywał się przy np. anuluj?

Offline ultr

  • Users
  • Guru
  • *****
  • Wiadomości: 1177
    • Zobacz profil
Instrukcja case - problem przy wyborze anuluj.
« Odpowiedź #10 dnia: 2014-01-28, 22:32:34 »
Może rozpisz sobie co ten skrypt ma po kolei robić i jak działać. Choćby jako schemat blokowy. I porównaj z kodem. Bo dziwne pytania zadajesz...

...
01 status=$?
02 echo
03 case
04 0)
05    1)
06    2)
07    3)
08 1)
09 255)
10 esac
11 esac
12 tar
->
...
01 status=$?
02 echo
03 case
04 0) case
05       1)
06       2)
07       3)
10    esac
13    wczytywanie nazwy pliku, itd.
12    tar
08 1)
09 255)
11 esac

krzysiek486

  • Gość
Instrukcja case - problem przy wyborze anuluj.
« Odpowiedź #11 dnia: 2014-02-03, 12:57:47 »
W 13 linijce mam dać inputbox czy jak?
Jeśli zapisze wpisany przez użytkownika tekst do pliku, jak go wywołać przy "tar"?
Można jakoś użyć zmiennej w tamtym miejscu?
Próbowałem:
...
--inputbox "Podaj sciezke..." 8 35 ""=sciezka
lub tak ja przy zmiennej wybor, cały dialog z inputboxem dać w ``, ale to raczej też nie przejdzie.
Można prosić o jeszcze jakieś wskazówki? Może to nie jest jakieś mega skomplikowane, ale nie potrafię wstawić tam miejsca na wpisanie ścieżki przez użytkownika...

darkdancer

  • Gość
Instrukcja case - problem przy wyborze anuluj.
« Odpowiedź #12 dnia: 2014-02-04, 14:29:59 »
Cytat: krzysiek486
W 13 linijce mam dać inputbox czy jak?
Jeśli zapisze wpisany przez użytkownika tekst do pliku, jak go wywołać przy "tar"?
Można jakoś użyć zmiennej w tamtym miejscu?
Tzn. user ma podać katalog w którym ma się coś archiwizować? Może coś w takim stylu bardziej?
Kod: bash [Zaznacz]

#!/bin/sh

defaultpath=~/backups/archive
backuptarget=/jakis/katalog

dialog --title 'Wybierz rodzaj archiwizacji:' \\
    --radiolist 'Dostępne opcje:' 10 40 3 \\
    1 'Bez kompresji' 'on' \\
    2 'Z kompresją GZIP' 'off' \\
    3 'Z kompresją BZIP2' 'off' 2>/tmp/compression.tmp

read compression_type < /tmp/compression.tmp
case $compression_type in
    1 ) extension='tar'
        extra_options=
        ;;
    2 ) extension='tar.gz'
        extra_options=-g
        ;;
    3 ) extension='tar.bz2'
        extra_options=-j
        ;;
esac

dialog --title 'Ścieżka do archiwum (bez rozszerzenia)' \\
    --fselect $defaultpath 10 60 2>/tmp/path.tmp

read archive_path < /tmp/path.tmp
archive_dir=`dirname $archive_path`
archive_file=`basename $archive_path`

if [ ! -d "$archive_dir" ]; then
    mkdir -pv "$archive_dir"
fi
rm -f /tmp/path.tmp /tmp/compression.tmp

echo "Przystępujemy do działania..."

echo "Archiwum umieszczę w katalogu: ${archive_dir}"
echo "Plik będzie miał nazwę: ${archive_file}.${extension}"
echo "Pełna ścieżka do pliku: ${archive_path}.${extension}"

echo "Wywołam w tym celu coś jak:"
echo "tar -vc ${extra_options} -f ${archive_path}.${extension} ${backuptarget}"

PS1. za karę za te screeny powinienem też sam wstawić żebyś przepisywał zamiast skopiować
PS2. nie ma obsługi potencjalnych błędów, nie sprawdzam co na wyjściu zwraca dialog
PS3. tar wewnątrz archiwum umieści pełną ścieżkę /jakis/katalog - poczytaj w dokumentacji jak to zmienić jeśli Ci takie zachowanie nie odpowiada

krzysiek486

  • Gość
Instrukcja case - problem przy wyborze anuluj.
« Odpowiedź #13 dnia: 2014-02-04, 15:13:39 »
Cytat: darkdancer
Tzn. user ma podać katalog w którym ma się coś archiwizować? Może coś w takim stylu bardziej?
Tak, o to chodzi. Za pomocą skryptów okienkowych chcę żeby użytkownik miał możliwość wpisania np. "archiwum.tar /home/nazwa/jakies_pliki" i skrypt odczyta to jako "tar -cf archiwum.tar /home/nazwa/jakies_pliki".
Doceniam trud włożony w napisanie powyższego, ale muszę skorzystać z wiedzy, której mnie nauczono. Raczej wszystko co umiem jest wyżej. Moja wiedz ogranicza się do komend typu echo, cat, tar, ls, pwd, cp, tree, mv, touch, mkdir, rmdir, chmod. Do tego trochę case i if.
Coś z takiej wiedzy da się sklecić?

krzysiek486

  • Gość
Instrukcja case - problem przy wyborze anuluj.
« Odpowiedź #14 dnia: 2014-02-07, 15:59:31 »
Co jest nie tak, jeśli piszę:
case $status in
0 ) case $wybor in
     1 ) opcje=-cf ;;
     2 ) opcje=-czf ;;
     3 ) opcje=-cjf ;;
     esac ;;
     echo "Podaj sciezke..."
     read sciezka
     tar $opcje $sciezka
1 ) echo "Nacisnales Anuluj" ;;
255 ) echo "Nacisnales ESC" ;;
esac
Wiem, nie ma tam po opcjach skryptu okienkowego, ale nawet tym sposobem coś jest nie tak. Co zmienić?

Dodam jeszcze błędy:
Cytuj
1. syntax error near unexpected token `"Podaj sciezke..."`
2. `echo "Podaj sciezke..."`
Oba błędy w tej samej linijce.


Żeby nie przesadzać ze spamem, to jeszcze raz edytuję.
Starałem się chociaż trochę przeanalizować skrypt, który został napisany wyżej. Trochę czarna magia dla mnie, ale jeśli dobrze wnioskuję, może być coś takiego?:
case $status in
0 ) case $wybor in
     1 ) opcje=-cf ;;
     2 ) opcje=-czf ;;
     3 ) opcje=-cjf ;;
     esac ;;
dialog --title "Wprowadzanie sciezki" \\
--backtitle "lalala" \\
--inputbox "Wprowadz sciezke archiwizacji..." 8 35 "" 2> dane
read sciezka < /home/nazwa_usera/dane
tar $opcje $sciezka
To jedyne co przychodzi mi do głowy.
Prosiłbym o jakieś szybkie i konkretne odpowiedzi. Jeszcze jutro mogę nad nim trochę popracować. Nie wiem jak to będzie w niedzielę, a bardzo mi na zależy.