2016-11-12 96 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)) 

請記住,shell只支持整數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或空字符串,x爲emtpy,殼試圖分配

y=$[*12] 

因此錯誤。我不明白爲什麼循環在這種情況下結束,但是,因爲$z從不改變。

相關問題