Nowe posty

Autor Wątek: If w bashu, pewnie trywialny problem.  (Przeczytany 3221 razy)

wrredny

  • Gość
If w bashu, pewnie trywialny problem.
« dnia: 2009-06-24, 22:19:13 »
Witam.
Zaczynam uczyć się pisać skrypty w bashu, natrafilem już na problem, z którego rozwiązaniem nie potrafię sobie poradzić.

Załóżmy, że chcę, aby po wpisaniu TAK, zostala wyswietlona lista plikow, a po wpisaniu NIE, zostal wyswietlony komunikat "W takim razie nie." :

read lista

if
lista=TAK
then
ls
else
lista!=TAK
echo "W takim razie nie."
fi
Po uruchomieniu, jezeli wpisze TAK - wyswietla liste, jezeli wpisze NIE-...rowniez wyswietla.
Bardzo prosze o pomoc.

Offline mateo86

  • Users
  • Guru
  • *****
  • Wiadomości: 647
    • Zobacz profil
If w bashu, pewnie trywialny problem.
« Odpowiedź #1 dnia: 2009-06-24, 22:56:56 »
Oj, oj... To nie ma prawa działać - nie jest tak łatwo, jak można by było myśleć

Składnia instrukcji warunkowej powinna wyglądać mniej więcej tak:

if [warunek]
then [instrukcja1]
else [instrukcja2]
fi

A u ciebie jest tak:
if [warunek]
then [instrukcja1]
else [warunek] [instrukcja2]
fi

Poza tym brakuje kilku średników na końcu linii, oraz znaki powinny być brane między apostrofy...
Przynajmniej tak jest w języku C, a bash stamtąd czerpie podstawy i składnię...

I jeszcze na początku brakuje deklaracji skryptu:
#!/bin/bash

arctgx

  • Gość
If w bashu, pewnie trywialny problem.
« Odpowiedź #2 dnia: 2009-06-24, 23:27:44 »
W bashu średniki w takich sytuacjach nie są potrzebne, jeśli zastępujemy je znakami nowej linii. Dotyczy to nie tylko skryptów, ale nawet linii poleceń (przynajmniej u mnie tak działa).
if
[[ 1 -gt 2 ]]
then
echo tak
else
echo nie
fi
równoważne jest zapisowi
if [[ 1 -gt 2 ]]; then echo tak; else echo nie; fi
(nawet historia zwróciła mi drugą postać, gdy wklepałem pierwszą).
U Ciebie wyświetla zawsze listę dlatego, że polecenie lista=TAK (czy też z nie) zwraca tzw. zerowy kod zakończenia (niech mnie ktoś poprawi, jeśli błędnie to wytłumaczyłem). Swoją drogą, polecenie to nie jest żadnym sprawdzeniem równości tylko przypisaniem wartości zmiennej. Zobacz man bash na temat [, [[ oraz test, a także porównań łańcuchów i liczb. Przykładów w sieci też masa, więc nie służę własnym.

wrredny

  • Gość
If w bashu, pewnie trywialny problem.
« Odpowiedź #3 dnia: 2009-06-24, 23:31:58 »
O! Dzieki wielkie, juz wiem. :)
Zupelnie zapomnialem o poleceniu TEST.
Teraz to dziala i wyglada tak:

read lista
if
test $lista = TAK
then
ls
else
echo "w takim razie nie."
fi

arctgx

  • Gość
If w bashu, pewnie trywialny problem.
« Odpowiedź #4 dnia: 2009-06-25, 00:14:32 »
A jednak wycofuję się z jednego zdania: pojedynczy znak równości też może być użyty w bashu do porównania - nie tylko w poleceniu test (czyli [), ale i w [[. Jest o tym mowa w podręczniku, ale i żaden problem sprawdzić. U Ciebie w początkowej wersji było to jednak przypisanie, bo nie poprzedziłeś tego zapisu jednym z powyższych wyróżnionych grubą czcionką.