2016-11-12 3 views
0

Я получаю ошибку: line 9: * 12: syntax error: operand expected (error token is "* 12") (я ввел 3, 4, 1 в качестве теста на скрипт), результат, который мне еще нужно показать в конце но после этой строки ошибки. Почему эта строка показывает, что все «работает»?ошибка: строка 9: * 12: синтаксическая ошибка: ожидаемый операнд

Вот мой код, чтобы вы могли понять, что я сделал:

y='1' 
z='0' 

while [ $z = 0 ] 
do 
read x 
     if [[ "$x" -ge "0" ]]; 
     then 
     y=$[$x*$y] 
     fi 
done 

echo -n "The multiplication of positive numbers entered is: $y" 

exit 

ответ

0

Синтаксис этой линии не является правильным:

y=$[$x*$y] 

Чтобы присвоить результат $x * $y к $y, используйте этот :

y=$((x * y)) 

Помните, что оболочка поддерживает только целое число ar ithmetic.

+0

Я пробовал это, но теперь ctrl + d не останавливает цикл и переходит к эхо-биту. – Uranus

+1

Проблема заключается в отсутствующем операнде, когда 'x' пуст, а не синтаксис. – janos

+3

'$ [...]' - устаревший недокументированный, но все еще поддерживаемый предшественник синтаксиса POSIX '$ ((...)). – chepner

2
line 9: * 12: syntax error: operand expected (error token is "* 12") 

Как это возможно? Сообщение пытается сказать вам, что ожидается операнд, , но его там не было. В качестве дополнительного намека токен ошибки равен * 12. Посмотрите внимательно, где это может быть.

Это происходит в выражении $x*$y. Например, если x равно 2, а y - 12, , то выражение равно 2 * 12. Но если значение x является пустая строка, то выражение не * 12, то есть ничего умноженное на 12. Это не имеет никакого смысла, следовательно, ошибка.

Когда x не имеет никакого значения (вы ввели пустую строку), вы, вероятно, хотите, чтобы выйти из цикла:

while [ $z = 0 ]; do 
    read x 
    [[ $x ]] || break 
    if [[ "$x" -ge "0" ]]; then 
     y=$[$x*$y] 
    fi 
done 

Кроме того, , как @mklement0 отметил в комментарии, $[...] синтаксис устарел в пользу $((...)), и нет веских оснований для смешивания [...] и [[...]] условных условных обозначений. Вот более современный, более чистый вариант вашего сценария, также с неиспользованной z переменной устранен:

while true; do 
    read x 
    [[ $x ]] || break 
    if ((x >= 0)); then 
     ((y = x * y)) 
    fi 
done 
2

Как вы закончить ввод? Если вы вошли в Ctrl + D или пустую строку, х был пуст, и оболочка пыталась присвоить

y=$[*12] 

Следовательно, ошибку. Я не понимаю, почему цикл заканчивается в таком случае, поскольку $z никогда не изменяется.

Смежные вопросы