Ниже у меня есть сценарий оболочки, который я записал и когда я пытаюсь выполнить его, я получаю ошибку в своем терминале, описывающем "ожидание 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
“Ожидание fi
” означает, что Ваш сценарий пропускает это ключевое слово. В Вашем случае Вы имеете два if
s, но только один 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.
Как десерт, на который уже указывают, имея два if
s, но только один 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