& ldquo; синтаксическая ошибка: неожиданный конец файла & rdquo; простой скрипт

Мне нужна помощь для очень простого сценария, я не понимаю, в чем причина. Сценарий:

#!/bin/bash

declare -i s
declare -i m
declare -i h

if [ "$3" < 50 ]; then s=$3+10  m=$2  h=$1
        else if ["$2" < 50 ];
                then s=$3-50  m=$2+1  h=$1
                    else s=$1-50  m=$2-50  h=$1+1 fi 
fi 

echo "$h:$m:$s"

Сценарий добавляет 10sc к времени, которое мы ввели.

Я получаю это сообщение об ошибке: «sub_change_dirrect: строка 14: синтаксическая ошибка: неожиданный конец файла»

2
задан 3 June 2012 в 16:54

2 ответа

Вы забыли ; после вложенного оператора fi

#!/bin/bash

declare -i s
declare -i m
declare -i h

if [ "$3" < 50 ]; then s=$3+10  m=$2  h=$1
        else if ["$2" < 50 ];
                then s=$3-50  m=$2+1  h=$1
                    else s=$1-50  m=$2-50  h=$1+1 ;fi 
fi 

echo "$h:$m:$s"
.
0
ответ дан 3 June 2012 в 16:54

Есть три очевидные ошибки:

  • В строке else s=$1-50 m=$2-50 h=$1+1 fi слово fi не рассматривается как ключевое слово, поскольку оно не является первым словом в команде. Для оболочки это выглядит как три назначения, которые применяются к команде fi. Если вы когда-нибудь выполните эту строку, вы увидите ошибку bash: fi: command not found. Поместите fi на отдельной строке (или поставьте перед собой ;).
  • [ "$3" < 50 ] совпадает с [ "$3" ] < 50 - это команда [ … ] (которую также можно записать test) с единственным аргументом "$3" и с перенаправлением ввода из файла 50. Либо используйте оператор сравнения чисел -lt, либо используйте арифметическую инструкцию (( … )). Конструкция с одной скобкой - это обычная встроенная команда, поэтому специальные символы, такие как <, сохраняют свое обычное значение. Конструкция с двойными круглыми скобками имеет специальный синтаксис, и вы можете использовать < как оператор сравнения чисел внутри.
  • ["$2" < 50 ] отсутствует пробел после открывающей скобки.

Также обычное соглашение в скриптах оболочки - ставить новую строку после then и else. Кроме того, вместо блока else, который полностью состоит из оператора if, вы должны использовать elif. И, пожалуйста, сделайте отступ последовательно.

#!/bin/bash
declare -i s
declare -i m
declare -i h

if (( $3 < 50 )); then
  s=$3+10  m=$2  h=$1
elif (( $2 < 50 )); then
  s=$3-50  m=$2+1  h=$1
else
  s=$1-50  m=$2-50  h=$1+1
fi 

echo "$h:$m:$s"

П.С. Я не пересмотрел вашу логику. Вы, кажется, ищете date +%T -d 'now + 10 seconds'.

0
ответ дан 3 June 2012 в 16:54

Другие вопросы по тегам:

Похожие вопросы: