2015-06-29 13 views
8

non ho mai programmato in bash ... ma sto cercando di risolvere un problema per un anchievement in un gioco (codingame.com)Una linea if in bash

Ho il seguente codice:

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

e questo errore:

/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 

voglio mettere a confronto i valori adiacenti di mia matrice e memorizzare il diference minima tra di loro ... ma io riesco a capire come fare una dichiarazione Se in bash

+0

L'esecuzione di questo attraverso http://shellcheck.net/ sarebbe prendere alcuni elementi che, del resto, la gente qui no –

+2

Attenzione - 'if ((tmp

risposta

14

Ogni comando deve essere terminato correttamente, sia con una nuova riga che con un punto e virgola. In questo caso, è necessario separare l'assegnazione di result dalla parola chiave fi. Prova ad aggiungere un punto e virgola;

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 

Inoltre, è necessario utilizzare lt piuttosto che <, dal momento che < è un operatore di redirezione. (A meno che non si intende eseguire un comando chiamato $tmp con il contributo di un file chiamato dalla variabile $result)

+0

I comandi devono essere * separati * da punti e virgola, non terminati da essi. – ikegami

+0

separare i token serve a terminare il comando nel parser. –

+0

Il punto e virgola indica la fine di una dichiarazione, non termina nulla. – 123

-1

vostre if deve essere seguita da un comando fi, ma non si dispone di tale comando. Hai un fi nel tuo codice, ma è nel mezzo di un altro comando, quindi non completa più lo if quindi lo fi nello echo fi farebbe. Se vuoi unire le linee, devi usare un punto e virgola per separare i comandi.

Quindi, per crollare

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 

usereste

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 
  • Eccezione: do e then può essere seguito da un comando, in modo da non avete bisogno di un punto e virgola dopo di loro quando si fondono nella riga successiva.

  • Nota come non è necessario terminare i comandi con ;? ; è necessario solo tra i comandi.

  • All'interno di un test ([]), -lt viene utilizzato per confrontare i numeri.

+1

Si potrebbe voler usare l'operatore aritmetico per il confronto '-lt' – 123

+0

@ Utente112638726, Risolto. – ikegami

5

ti manca un punto e virgola e necessario utilizzare -lt invece di <, come altri hanno sottolineato.

Un'alternativa alla dichiarazione if sarebbe quella di utilizzare la logica e operatore &&:

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

Wrong, OP ha richiesto una riga se l'istruzione, && non è un'istruzione if, mi dispiace. – 123

+1

@ Utente112638726 Pensi che qualcuno chieda * "Come salta fuori dalla finestra" * Non sono autorizzato a rispondere * "Per favore non farlo!" *? È esplicitamente dire: 'Leggi attentamente la domanda. Qual è, in particolare, la domanda che ti chiede? Assicurati che la tua risposta lo fornisca - o un'alternativa valida. Per favore leggi le FAQ prima di votare e/o commentare post. – hek2mgl

+0

@ User112638726 Collegamento alle domande frequenti: http://stackoverflow.com/help/how-to-answer .. Effettivamente, il vandalizm l'ho segnalato. – hek2mgl