сценарий оболочки Linux Синтаксическая ошибка: неожиданное слово (ожидание “fi”)

Ниже у меня есть сценарий оболочки, который я записал и когда я пытаюсь выполнить его, я получаю ошибку в своем терминале, описывающем "ожидание fi" ключевое слово. Я записал его перед сделанным ключевым словом и все еще не сумел преодолеть к ошибке. Кто-либо может сказать мне относительно того, как решить эту ошибку и где в моем подходе я сделал ошибку?

    VAL1=0
    VAL2=0

    while [ "$VAL1" -eq 0 ] && [ "$VAL2" -eq 0 ]
        do read -p "Enter values for both numbers" VAL1 VAL2
            if [ "$VAL1" -eq 99 ]  || [ "$VAL1" -eq 99 ] 
                then break 
            else read -p "Enter value number two" VAL2
                if [ "$VAL2" -eq 0 ]
                    then echo "Cannot divide by zero"
                else echo $(( VAL1 / VAL2 ))
    fi
    done
1
задан 21 March 2019 в 23:37

2 ответа

“Ожидание fi” означает, что Ваш сценарий пропускает это ключевое слово. В Вашем случае Вы имеете два ifs, но только один fi, отъезд открытого первого. Исправьте его к:

            else echo $(( VAL1 / VAL2 ))
            fi
        fi
done

Для отладки сценариев оболочки, это - хорошая идея использовать shellcheck или онлайн или через команду shellcheck (sudo apt install shellcheck):

$ shellcheck myscript

Line 4:
    while [ "$VAL1" -eq 0 ] && [ "$VAL2" -eq 0 ]
    ^-- SC1009: The mentioned syntax error was in this while loop.

Line 6:
            if [ "$VAL1" -eq 99 ]  || [ "$VAL1" -eq 99 ] 
            ^-- SC1046: Couldn't find 'fi' for this 'if'.
            ^-- SC1073: Couldn't parse this if expression. Fix to allow more checks.

Line 13:
    done
    ^-- SC1047: Expected 'fi' matching previously mentioned 'if'.
        ^-- SC1072: Unexpected keyword/token. Fix any mentioned problems and try again.
3
ответ дан 3 December 2019 в 06:36

Как десерт, на который уже указывают, имея два ifs, но только один fi сразу говорит Вам, что существует несоответствие где-нибудь в Вашем условном операторе.

Одна вещь, которую я предложил бы, состоит в том, что при кодировании, это помогает использовать добавление отступа, чтобы помочь выяснить, пропускаете ли Вы какую-либо структуру. Хранение Ваш if-then-else-fi в том же столбце один прием, который может использоваться для отслеживания эти вещи. То же для case-esac или do-done в этом отношении.

С помощью кода кода, если мы делаем отступ тем способом, это довольно ясно относительно чего-то пропавшие без вести:

VAL1=0 
VAL2=0

while [ "$VAL1" -eq 0 ] && [ "$VAL2" -eq 0 ]
do 
  read -p "Enter values for both numbers" VAL1 
  if [ "$VAL1" -eq 99 ]  || [ "$VAL1" -eq 99 ] 
  then 
    break 
  else 
    read -p "Enter value number two" VAL2
    if [ "$VAL2" -eq 0 ]
    then 
      echo "Cannot divide by zero"
    else 
      echo $(( VAL1 / VAL2 )) 
    fi 
  ??     <------ *Missing fi would likely have been detected here*
done
2
ответ дан 3 December 2019 в 06:36

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

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