2015-06-29 12 views
8

Nigdy wcześniej zaprogramowana w bash ... ale staram się rozwiązać problem dla anchievement w grze (codingame.com)Jedna linia if w bash

Mam następujący kod:

for ((i=0; i<N-1; i++)); do 
    tmp=$((sorted_array[i+1] - sorted_array[i])); 
    if [ $tmp < $result ]; then result=$tmp fi 
done 

i ten błąd:

/tmp/Answer.sh: line 42: syntax error near unexpected token `done'at Answer.sh. on line 42 
/tmp/Answer.sh: line 42: `done' at Answer.sh. on line 42 

Chcę porównać sąsiednie wartości mojej tablicy i zapisać minimun diference między nimi ... ale nie mogę zrozumieć, jak to zrobić w instrukcji IF bash

+0

Running to poprzez http://shellcheck.net/ by złapać kilka elementów, które, o to chodzi, ludzie tutaj nie mam. –

+2

Pamiętaj - "if ((tmp

Odpowiedz

14

Każde polecenie musi być poprawnie zakończone, albo przez znak nowej linii, albo przez średnik. W takim przypadku musisz oddzielić przypisanie result od słowa kluczowego fi. Spróbuj dodać średnik;

for ((i=0; i<N-1; i++)); do 
    tmp=$((sorted_array[i+1] - sorted_array[i])) 
    if [ $tmp -lt $result ]; then result=$tmp; fi 
done 

Również trzeba użyć lt zamiast <, ponieważ < jest operatorem przekierowania. (Chyba, że ​​masz zamiar uruchomić polecenie o nazwie $tmp z wejściem od pliku o nazwie przez zmienną $result)

+0

Komendy muszą być * oddzielone * średnikami, a nie przez nie przerywane. – ikegami

+0

oddzielenie tokenów służy do zakończenia polecenia w analizatorze składni. –

+0

Średnik oznacza koniec instrukcji, nic nie kończy. – 123

-1

swoje if musi być przestrzegane przez komendę fi, ale nie ma takiego polecenia. Masz kod fi w kodzie, ale jest on w środku innego polecenia, więc nie będzie już kompletnym if, a następnie fi w echo fi. Jeśli chcesz połączyć linie, musisz użyć średnika, aby oddzielić polecenia.

Więc aby zwinąć

for ((i=0; i<N-1; i++)) 
do 
    tmp=$((sorted_array[i+1] - sorted_array[i])) 
    if [ $tmp -lt $result ] 
    then 
     result=$tmp 
    fi 
done 

byłoby użyć

for ((i=0; i<N-1; i++)); do 
    tmp=$((sorted_array[i+1] - sorted_array[i])) 
    if [ $tmp -lt $result ]; then result=$tmp; fi 
done 
  • Wyjątek: do i then można następnie polecenia, więc nie trzeba średnik po nich, kiedy połączysz się w kolejną linię.

  • Zauważ, jak nie trzeba kończyć poleceń za pomocą ;? ; jest potrzebny tylko między poleceniami.

  • Wewnątrz urządzenia test ([]), -lt służy do porównywania liczb.

+1

Możesz użyć operatora arytmetycznego do porównania '-lt' – 123

+0

@ User112638726, Naprawiono. – ikegami

5

Brakuje średnik i trzeba użyć -lt zamiast <, jak inni wskazał.

Alternatywą do rachunku if byłoby użyć logicznego i operatora &&:

for ((i=0; i<N-1; i++)); do 
    tmp=$((sorted_array[i+1] - sorted_array[i])) 
    [ $tmp -lt $result ] && result=$tmp 
done 
+0

Niepoprawny, OP poprosił o jedną linię, jeśli instrukcja && nie jest instrukcją, jeśli jest, przepraszam. – 123

+1

@ User112638726 Myślisz, że jeśli ktoś zapyta * "Jak wyskoczyć przez okno" * Nie mogę odpowiedzieć * "Proszę, nie rób tego!" *? Czy wyraźnie mówi: "Przeczytaj uważnie to pytanie. O co właściwie chodzi z pytaniem? Upewnij się, że twoja odpowiedź to zapewnia - lub realną alternatywę. " Przeczytaj często zadawane pytania przed głosowaniem i/lub komentuj posty. – hek2mgl

+0

@ User112638726 Link do FAQ: http://stackoverflow.com/help/how-to-answer .. Właściwie to zrobiłeś vandalizm, oznaczyłem to. – hek2mgl