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: Problem z wyborem dni tygodnia w skrypcie  (Przeczytany 15371 razy)

piotrino

  • Gość
Problem z wyborem dni tygodnia w skrypcie
« dnia: 2013-09-20, 14:35:09 »
Witam. Mam taki skrypt zmodyfikowany według mnie:
[code
#!/bin/bash
echo "Podaj cyfrę dnia tygodnia"
read d
case   "$d" in
  "1") echo "Poniedziałek" ;;
  "2") echo "Wtorek" ;;
  "3") echo "Środa" ;;
  "4") echo "Czwartek" ;;
  "5") echo "Piątek" ;;
  "6") echo "Sobota" ;;
  "7") echo "Niedziela";;
   if [ $d -le 7 ]
 then
 *) echo "DZISIAJ JEST: $d"
else
echo "Podales zbyt wysoką liczbe wiekszą od 7"
echo "Podaj liczbę od 1 - 7 tyle ile wynosi tydzien"
essac] [/code]
Chcę doprowadzić żeby jak wstawię cyfre tygodnia ponad "7" to dostaję komunikat " Podałeś zbyt wysoką liczbę większa od7"  i dalej analogicznie do dalszej treści skkrtypu.
Po uruchomieniu skryptu i wpisaniu cyfry tygodnia:
 [root@centos programowanie]# ./case
Podaj cyfrę dnia tygodnia
1
./case: line 13: błąd składni przy nieoczekiwanym znaczniku `['
./case: line 13: `   if [ $d -le 7 ]'
[root@centos programowanie]#
dostaję powyższy komunikat błedu.... hm... co robię zle, gdzie zrobiłem bład, składnia  wygląda ok na moje...

Offline ultr

  • Users
  • Guru
  • *****
  • Wiadomości: 1177
    • Zobacz profil
Problem z wyborem dni tygodnia w skrypcie
« Odpowiedź #1 dnia: 2013-09-21, 09:28:23 »
Popsułeś tag code i połowy skryptu nie widać:)

#!/bin/bash
echo "Podaj cyfrę dnia tygodnia"
read d
case   "$d" in
  "1") echo "Poniedziałek" ;;
  "2") echo "Wtorek" ;;
  "3") echo "Środa" ;;
  "4") echo "Czwartek" ;;
  "5") echo "Piątek" ;;
  "6") echo "Sobota" ;;
  "7") echo "Niedziela";;
   if [ $d -le 7 ]
 then
 *) echo "DZISIAJ JEST: $d"
else
echo "Podales zbyt wysoką liczbe wiekszą od 7"
echo "Podaj liczbę od 1 - 7 tyle ile wynosi tydzien"
essac

Offline ultr

  • Users
  • Guru
  • *****
  • Wiadomości: 1177
    • Zobacz profil
Problem z wyborem dni tygodnia w skrypcie
« Odpowiedź #2 dnia: 2013-09-21, 09:37:07 »
A skrypt nie działa, bo
1) wstawiasz inny kod przed zamknięciem case..esac.
2) esac nie essac
3) nie podałeś fi za if-em
4) *) służy do obsłużenia pozostałych przypadków w case (taki else)

Fixed:

#!/bin/bash

read -p "Podaj liczbe dnia tygodnia: " d

if [ $d -gt 7 ] || [ $d -lt 1 ]; then
  echo -e "Podales niepoprawna liczbe.\\nPodaj liczbę od 1-7, tyle ile dni ma tydzien."
  exit 1
fi

echo -n "DZISIAJ JEST "
case "$d" in
  "1") echo "PONIEDZIALEK" ;;
  "2") echo "WTOREK" ;;
  "3") echo "SRODA" ;;
  "4") echo "CZWARTEK" ;;
  "5") echo "PIATEK" ;;
  "6") echo "SOBOTA" ;;
  "7") echo "NIEDZIELA";;
esac

exit 0

piotrino

  • Gość
Problem z wyborem dni tygodnia w skrypcie
« Odpowiedź #3 dnia: 2013-09-23, 12:23:04 »
Wielkie dzięki, o to mi chodziło. Niby kombinowałem dobrze ale nie w tej kolejności... Dużo nauki przede mną jeszce :) Dzieki

P.S Czy jest mozliwość kontynuacji wybierania dnia tygodnia po tym komunikacie:
 echo -e "Podales niepoprawna liczbe.\\nPodaj liczbę od 1-7, tyle ile dni ma tydzien."
bez wpisywania kodu od początku? pOzdrawiam

darkdancer

  • Gość
Problem z wyborem dni tygodnia w skrypcie
« Odpowiedź #4 dnia: 2013-09-24, 15:48:21 »
Cytat: piotrino
P.S Czy jest mozliwość kontynuacji wybierania dnia tygodnia po tym komunikacie
Jest możliwość, np. za pomocą pętli while:
Kod: bash [Zaznacz]

while : ; do
  read -p "Podaj liczbe dnia tygodnia: " d
  if [ $d -gt 7 ] || [ $d -lt 1 ]; then
    echo -e "Podales niepoprawna liczbe.\\nPodaj liczbę od 1-7, tyle ile dni ma tydzien."
  else
    break
  fi
done

Albo tak:
Kod: bash [Zaznacz]

read -p "Podaj liczbe dnia tygodnia: " d
while [ $d -gt 7 ] || [ $d -lt 1 ]; do
  echo -e "Podales niepoprawna liczbe.\\nPodaj liczbę od 1-7, tyle ile dni ma tydzien."
  read -p "Podaj liczbe dnia tygodnia: " d
done

Oczywiście w obydwu przypadkach zakładamy, że "juser jest mondry i nie wpisze np. szejść".

piotrino

  • Gość
Problem z wyborem dni tygodnia w skrypcie
« Odpowiedź #5 dnia: 2013-09-25, 17:20:30 »
Cytat: darkdancer
"juser jest mondry i nie wpisze np. szejść".
 user jest mądry i nie wpisze np. sześć
Sorki za poprawkę, ale nie mogłem się powstrzymać :)
Co do skryptu, trochę pomógł, ale chodzi mi żeby po wpisaniu liczby większej od 7 i mniejszej od 1 dawał mi komunikat o błedzie jak daje w skrypcie a po tym miał dalej możliwość wpisania poprawnej liczby od 1-7 i po  wpisaniu pokazuje się wynik" Dziś jest poniedziałek .... niedziela " itp... Ale pokombinuję jeszcze... W koncu się uczę basha...

Pozdrawiam

Offline ultr

  • Users
  • Guru
  • *****
  • Wiadomości: 1177
    • Zobacz profil
Problem z wyborem dni tygodnia w skrypcie
« Odpowiedź #6 dnia: 2013-09-25, 17:45:32 »
Cytat: piotrino
chodzi mi żeby po wpisaniu liczby większej od 7 i mniejszej od 1 dawał mi komunikat o błedzie jak daje w skrypcie a po tym miał dalej możliwość wpisania poprawnej liczby od 1-7 [...]
Tak właśnie działają oba fragmenty kodu zaproponowane przez darkdancera. Wystarczy dodać do tego case-a z wyświetlaniem wyniku.

Co do nauki Basha, polecam na początek http://dief.republika.pl/main.html i ewentualnie inne kursy z Google.

A dla wprawki polecam 1) tą instrukcję case zastąpić tablicą nazw dni, oraz 2) odczytywać dzień tygodnia z polecenia "date" zamiast od użytkownika.

piotrino

  • Gość
Problem z wyborem dni tygodnia w skrypcie
« Odpowiedź #7 dnia: 2013-09-25, 17:55:32 »
Cytat: ultr
Cytat: piotrino
chodzi mi żeby po wpisaniu liczby większej od 7 i mniejszej od 1 dawał mi komunikat o błedzie jak daje w skrypcie a po tym miał dalej możliwość wpisania poprawnej liczby od 1-7 [...]
Tak właśnie działają oba fragmenty kodu zaproponowane przez darkdancera. Wystarczy dodać do tego case-a z wyświetlaniem wyniku.

Co do nauki Basha, polecam na początek http://dief.republika.pl/main.html i ewentualnie inne kursy z Google.

A dla wprawki polecam 1) tą instrukcję case zastąpić tablicą nazw dni, oraz 2) odczytywać dzień tygodnia z polecenia "date" zamiast od użytkownika.
Dzięki. I tu ma pytanie, gdzie mogę dodać tego case w kodzie, w którym miejscu? Kombinuję cały czas ale mam błedy w skrypcie przy uruchomieniu...

Offline ultr

  • Users
  • Guru
  • *****
  • Wiadomości: 1177
    • Zobacz profil
Problem z wyborem dni tygodnia w skrypcie
« Odpowiedź #8 dnia: 2013-09-25, 17:57:56 »
Pod tym kodem. Ten kod wczyta zmienną d, a potem case sprawdzi jej wartość i wyświetli wynik. To chyba dość proste ;)

piotrino

  • Gość
Problem z wyborem dni tygodnia w skrypcie
« Odpowiedź #9 dnia: 2013-09-26, 12:05:34 »
Cytat: ultr
Pod tym kodem. Ten kod wczyta zmienną d, a potem case sprawdzi jej wartość i wyświetli wynik. To chyba dość proste ;)
Hm....nie takie proste, jak wpisuję case pod tym kodem to błedy się sypią...
Podaję cały skrypt po modyfikacji:
#!/bin/bash

read -p "Podaj liczbe dnia tygodnia: " d

if [ $d -gt 7 ] || [ $d -lt 1 ]; then
  echo -e "Podales niepoprawna liczbe.\\nPodaj liczbę od 1-7, tyle ile dni ma tydzien."
read -p "Podaj liczbe dnia tygodnia: " d
while [ $d -gt 7 ] || [ $d -lt 1 ]; do
  echo -e "Podales niepoprawna liczbe.\\nPodaj liczbę od 1-7, tyle ile dni ma tydzien."
  read -p "Podaj liczbe dnia tygodnia: " d
done
 exit 1
fi
echo -n "DZISIAJ JEST "
case "$d" in
  "1") echo "PONIEDZIALEK" ;;
  "2") echo "WTOREK" ;;
  "3") echo "SRODA" ;;
  "4") echo "CZWARTEK" ;;
  "5") echo "PIATEK" ;;
  "6") echo "SOBOTA" ;;
  "7") echo "NIEDZIELA";;
esac
exit 0
Jak rozumuję i dobrze odczytałem twóją radę
 Wystarczy dodać do tego case-a z wyświetlaniem wyniku
to dodaję case pod poleceniem done? Ale sypią się błedy po uruchomieniu skryptu. Jeśli chodzi o naukę basha to preferuję naukę od podstaw ale na przepisywaniu gotowych skryptów, ale probowanie modyfikacji tych skryptów przez dodawanie do tych skryptów dodatkowych parametrów. W ten sposób się uczę...

Offline ultr

  • Users
  • Guru
  • *****
  • Wiadomości: 1177
    • Zobacz profil
Problem z wyborem dni tygodnia w skrypcie
« Odpowiedź #10 dnia: 2013-09-26, 18:36:36 »
W którym miejscy tego wątku widzisz tego potworka, którego masz w swoim kodzie przed tym case-m? Czy tak trudno jest poprawnie użyć kopiuj-wklej?

Może przeanalizuj podane w wątku fragmenty linia po linii i pomyśl przez chwilę nad tym (prostym) kodem, zamiast bezmyślnie go sklejać. Każda z linii zamieszczonego w tym wątku kodu mówi praktycznie sama za siebie co robi.

piotrino

  • Gość
Problem z wyborem dni tygodnia w skrypcie
« Odpowiedź #11 dnia: 2013-09-27, 12:39:41 »
Cytat: ultr
W którym miejscy tego wątku widzisz tego potworka, którego masz w swoim kodzie przed tym case-m? Czy tak trudno jest poprawnie użyć kopiuj-wklej?

Może przeanalizuj podane w wątku fragmenty linia po linii i pomyśl przez chwilę nad tym (prostym) kodem, zamiast bezmyślnie go sklejać. Każda z linii zamieszczonego w tym wątku kodu mówi praktycznie sama za siebie co robi.
Dzięki, jednak jak trochę nad tym posiedziałem to w koncu zrobiłem.  Opieprz dostałem zasadnie od ciebie... Zamiast samemu kombinować, to czekam na gotowca od was.... Przy okazji tak to zrobiłem:

  #!/bin/bash

 
read -p "Podaj liczbe dnia tygodnia: " d
while [ $d -gt 7 ] || [ $d -lt 1 ]; do
  echo -e "Podales niepoprawna liczbe.\\nPodaj liczbę od 1-7, tyle ile dni ma tydzien."
  read -p "Podaj liczbe dnia tygodnia: " d
done
if [ $d -gt 7 ] || [ $d -lt 1 ]; then
  echo -e "Podales niepoprawna liczbe.\\nPodaj liczbę od 1-7, tyle ile dni ma tydzien."
  exit 1
fi

echo -n "DZISIAJ JEST "
case "$d" in
  "1") echo "PONIEDZIALEK" ;;
  "2") echo "WTOREK" ;;
  "3") echo "SRODA" ;;
  "4") echo "CZWARTEK" ;;
  "5") echo "PIATEK" ;;
  "6") echo "SOBOTA" ;;
  "7") echo "NIEDZIELA";;

esac

exit 0

Offline
Teraz pobawię się w wywoływanie "date".

Offline ultr

  • Users
  • Guru
  • *****
  • Wiadomości: 1177
    • Zobacz profil
Problem z wyborem dni tygodnia w skrypcie
« Odpowiedź #12 dnia: 2013-09-28, 10:22:26 »
Trochę powtórzeń kodu:

read -p "Podaj liczbe dnia tygodnia: " d
while [ $d -gt 7 ] || [ $d -lt 1 ]; do
____echo -e "Podales niepoprawna liczbe.\\nPodaj liczbę od 1-7, tyle ile dni ma tydzien."
____read -p "Podaj liczbe dnia tygodnia: " d
done
if [ $d -gt 7 ] || [ $d -lt 1 ]; then
____echo -e "Podales niepoprawna liczbe.\\nPodaj liczbę od 1-7, tyle ile dni ma tydzien."
____exit 1
fi

Od razu widać, że tego całego tego if-a można wyrzucić, bo wcześniejszy while sprawdza ten sam warunek. Skoro pętla while się zakończy, to znaczy,. że warunek nie jest już spełniony, a więc i ten if sprawdzający ten sam warunek nigdy się nie wykona. I dobrze, że się nie wykonuje, bo "exit 1" zdecydowanie nie jest tym, co chcesz.

Zostaje jeszcze powtórzenie:
read -p "Podaj liczbe dnia tygodnia: " d
Tutaj lepszym rozwiązaniem jest ten drugi kod zaproponowany przez darkdancera. W nim żaden kod się nie powtarza:
while : ; do
  read -p "Podaj liczbe dnia tygodnia: " d
  if [ $d -gt 7 ] || [ $d -lt 1 ]; then
    echo -e "Podales niepoprawna liczbe.\\nPodaj liczbę od 1-7, tyle ile dni ma tydzien."
  else
    break
  fi
done
.

Co do polecenia "date", przydadzą Ci się konstrukcje $() lub `` oraz przekazywanie danych za pomocą |, tzw. pipe. Powodzenia.

piotrino

  • Gość
Problem z wyborem dni tygodnia w skrypcie
« Odpowiedź #13 dnia: 2013-09-29, 13:38:51 »
OK, zrobiłem tak:
  #!/bin/bash

 
read -p "Podaj liczbe dnia tygodnia: " d
while [ $d -gt 7 ] || [ $d -lt 1 ]; do
  echo -e "Podales niepoprawna liczbe.\\nPodaj liczbę od 1-7, tyle ile dni ma tydzien."
  read -p "Podaj liczbe dnia tygodnia: " d
done

echo -n "DZISIAJ JEST "
case "$d" in
  "1") echo "PONIEDZIALEK" ;;
  "2") echo "WTOREK" ;;
  "3") echo "SRODA" ;;
  "4") echo "CZWARTEK" ;;
  "5") echo "PIATEK" ;;
  "6") echo "SOBOTA" ;;
  "7") echo "NIEDZIELA";;

esac
Też działa, przy moim ostatnim kodzie z if też działało, tylko tu mniej kodu zostało zastosowane. Ale czaję powoli o co chodzi.  Dzięki za wskazówki co "date" .....