Одна строка if оператор в bash

Я никогда не программировал в bash... тем не менее, я пытаюсь решить проблему для anchievement в игре (codingame.com)

у меня есть следующий код:

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

и эта ошибка:

/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

Я хочу сравнить соседние значения моего массива и сохранить минимальную разницу между ними... но я не могу понять, как сделать оператор If в bash

3 ответов


каждая команда должна быть правильно завершена либо новой строкой, либо точкой с запятой. В этом случае вам необходимо отделить назначение result с сайта fi. Попробуйте добавить точку с запятой;

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

кроме того, нужно использовать lt, а не < С < - оператор переадресации. (Если вы не собираетесь запускать команду с именем $tmp С вводом из файла с именем переменной $result)


вам не хватает точки с запятой и нужно использовать -lt вместо <, Как отметили другие.

альтернатива if оператор будет использовать логический и оператор &&:

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

код if должен следовать , но у вас нет такой команды. У вас есть fi в вашем коде, но он находится в середине другой команды, поэтому он больше не завершает if тут fi на echo fi будет. Если вы собираетесь объединить строки, вы должны использовать точку с запятой для разделения команд.

так рухнет

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

вы могли бы использовать

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
  • исключения: do и then может сопровождаться командой, поэтому вам не нужно двоеточие после них, когда вы сливаетесь в следующей строке.

  • обратите внимание, как вам не нужно завершать свои команды с ;? ; требуется только между командами.

  • внутри test ([]), -lt используется для сравнения чисел.