Nowe posty

Autor Wątek: too many arguments  (Przeczytany 2302 razy)

Offline 1709

  • Users
  • Guru
  • *****
  • Wiadomości: 2562
  • 1709
    • Zobacz profil
too many arguments
« dnia: 2014-12-26, 00:16:45 »
Skrypt:

#!/bin/bash
echo "Napisz \\" help \\" aby wiedziec wiecej "
echo "---------------------------"

#----------------------------------
x=1;
until [ $x = exit ]; do
# petla az do = lancuch znakow rowny exit
echo " :)  -------------"

read x
# czytaj i bedzie to "x"


# case - nie dam poniewaz obsluguje tylko 1 slowo
  if [ $x == "help" ]
then
echo " exit --> WYJSCIE "
echo " zapisz --> zapisze "
                    echo " wyczysc --> wyczysci okno "
                    echo " mango czekoladowe --> kiedy bedzie "


elif [ $x == "wyczysc" ]
then
clear


elif [ $x == "mango czekoladowe" ]
then
echo "Bedze w Sobote"


elif [ $x == "zapisz" ]
then
read y
echo " zapisane :: $y"


elif [ $x == "exit" ]
then
echo "Pa!"


            else
echo "Nie wiem oco chodzi..."
fi



done
Nie wiem jak mozna zeby if czytalo wszystkie lancuchy,
probowalem z case i to samo.
W tym przypadku chodzi o lancuchy "mango czekoladowe"  .

Cytuj
$ ./test.sh
Napisz " help " aby wiedziec wiecej
---------------------------
 :)  -------------
mango czekoladowe
./test.sh: line 28: [: too many arguments
./test.sh: line 38: [: too many arguments
./test.sh: line 45: [: too many arguments
./test.sh: line 52: [: too many arguments
./test.sh: line 59: [: too many arguments
Nie wiem oco chodzi...
./test.sh: line 19: [: too many arguments
 :)  -------------
PS: Brak polskiej czcionki, nie jest to brak lenistwa, a jej brak w systemie i brak czasu na reczne poprawki.

Offline ultr

  • Users
  • Guru
  • *****
  • Wiadomości: 1177
    • Zobacz profil
too many arguments
« Odpowiedź #1 dnia: 2014-12-26, 00:43:17 »
Weź odwołanie do zmiennej x w podwójny cudzysłów:
    "$x"
Polecam zawsze stosować taki zapis.

Z innych uwag:

Z kolei przy literałach możesz używać pojedynczych znaków cudzysłowu:
    'mango czekoladowe'

Poza tym lepiej używać pojedynczego = przy porównywaniu w teście [ ... ].
Tak jest kompatybilnie z sh, a == jest tylko w Bashu.

Zamiast dodawać enter przed then, możesz użyć średnika:
    elif [ $x == "mango czekoladowe" ]; then
Przynajmniej dla mnie jest to czytelniejszy zapis.

Powodzenia.

Offline roobal

  • Users
  • Guru
  • *****
  • Wiadomości: 2056
    • Zobacz profil
too many arguments
« Odpowiedź #2 dnia: 2014-12-26, 02:32:03 »
Zamiast if, spokojnie możesz użyć case i kod nawet krótszy jest. Ja bym to zrobił tak.
menu()
{
echo "Napisz \\" help \\" aby wiedziec wiecej "
echo "---------------------------"

#----------------------------------

echo " exit --> WYJSCIE "
echo " zapisz --> zapisze"
echo " wyczysc --> wyczysci okno "
echo " mango czekoladowe --> kiedy bedzie "

read x
case "$x" in

"exit") echo "Pa" ; sleep 5 ; exit ;;
'mango czekoladowe') echo "Bedzie w sobote" ;;
*) echo "Nie wiem oco chodzi..."
esac
}
menu
Do reszty opcji już sobie uzupełnij.

Offline 1709

  • Users
  • Guru
  • *****
  • Wiadomości: 2562
  • 1709
    • Zobacz profil
too many arguments
« Odpowiedź #3 dnia: 2014-12-26, 02:32:42 »
Dodanie nawiasu "$x" do $x przy porownywaniu if , elif
Cytuj
elif [ "$x" == "exit" ]
Faktycznie pomoglo, zauwazylem ze jesli w linii case
Cytuj
case "$x" in
mam cudzyslow to tez bedzie dzialac.

Dzieki za pomoc i rady. :)
PS: Brak polskiej czcionki, nie jest to brak lenistwa, a jej brak w systemie i brak czasu na reczne poprawki.

Offline roobal

  • Users
  • Guru
  • *****
  • Wiadomości: 2056
    • Zobacz profil
too many arguments
« Odpowiedź #4 dnia: 2014-12-26, 02:44:52 »
Zapomniałem dodać, że jak menu ma się wyświetlać na nowo dopóki nie wpisze się exit, to możesz samą funkcję uruchomić w pętli. Można też zrobić prowizoryczną pętlę ;)
menu()
{
echo "Napisz \\" help \\" aby wiedziec wiecej "
echo "---------------------------"

#----------------------------------

echo " exit --> WYJSCIE "
echo " zapisz --> zapisze"
echo " wyczysc --> wyczysci okno "
echo " mango czekoladowe --> kiedy bedzie "

read x
case "$x" in

"exit") echo "Pa" ; sleep 1 ; exit ;;
'mango czekoladowe') echo "Bedzie w sobote" ; menu ;;
*) echo "Nie wiem oco chodzi..." ; sleep 1 ; menu
esac
}
menu

Offline 1709

  • Users
  • Guru
  • *****
  • Wiadomości: 2562
  • 1709
    • Zobacz profil
too many arguments
« Odpowiedź #5 dnia: 2014-12-26, 12:18:18 »
Odnosnie przykladu wyzej

- Ciekawy sposob zapetlenia i dziala :D
- Linie
Cytuj
"exit") echo "Pa" ; sleep 1 ; exit ;;
chyba celowo dales na poczatek wyboru case,
bo jak ja dalem na koniec to nie chcialo mi dzialac,
widzi funkcje menu mimo ze w tamtej lini jej nie ma,
no to dalem jako przedostatnia linie i tez dziala.

#!/bin/bash


menu()
{
echo -e " \\n"
echo "Napisz \\" help \\" aby wiedziec wiecej "
echo "---------------------------"

#----------------------------------

read x
case "$x" in

    "help")              echo " exit --> WYJSCIE "
            echo " zapisz --> zapisze"
echo " wyczysc --> wyczysci okno "
echo " mango czekoladowe --> kiedy bedzie " ; menu ;;

"zapisz")            read y
    echo " zapisane :: $y"                      ; menu ;;
       
"wyczysc")           clear                 ; menu ;;

"mango czekoladowe") echo " Bedzie w sobote "                    ; menu ;;

"exit")              echo "Pa"                       ; sleep 1   ; exit ;;

*)                   echo " Nie wiem oco chodzi... " ; sleep 1   ; menu


esac
}

menu
PS: Brak polskiej czcionki, nie jest to brak lenistwa, a jej brak w systemie i brak czasu na reczne poprawki.

Offline roobal

  • Users
  • Guru
  • *****
  • Wiadomości: 2056
    • Zobacz profil
too many arguments
« Odpowiedź #6 dnia: 2014-12-26, 17:35:47 »
Tak celowo, żeby nie upychać wszystkiego w jednym.