2011-04-19 74 views
1

Argghh:有沒有一個好的工具來解析/評估數學表達式?

 
$ echo 2 4 | bc 
(standard_in) 1: parse error 
$ echo $? 
0 

究竟爲什麼會在識別語法錯誤,否則完全合理的計劃成功嗎?顯然,我不能用bc來評估表達式。就我個人而言,我喜歡dc,但我的用戶不想要反向擦亮。鑑於bc認可的形式的算術表達式,是否有合理的評估結果的程序?或者有沒有辦法讓bc合理? (在這裏,「合理的」意思是當輸入是僞造的時候它會失敗。)

回答

3

bc將嘗試從錯誤中恢復,並繼續處理後面的語句。例如:

$ echo "2 + 3; 
    4 4; 
    3 + 4" | bc 
5 
(standard_in) 2: parse error 
7 

因此,目前還不清楚在這種情況下是否應該返回錯誤。它成功解析並處理了輸入,正確地從錯誤中恢復並繼續處理稍後的指令。根據POSIX,當在非交互模式下檢測到無效輸入時,bc的行爲未定義,因此這在bc應如何表現的規範內。

如果你想測試,如果有任何錯誤,在處理你的輸入,你可以STDERR重定向到一個臨時文件,然後檢查的內容,以查找錯誤:

bcerr=$(mktemp -t bcerr) 
result=$(echo 2 4 | bc 2>$bcerr) 
if test -s $bcerr 
then 
    # handle errors 
else 
    # handle success 
fi 
rm $bcerr 
0

您可以通過查看stderr輸出,或者通過將stderr重定向到/ dev/null並識別輸出時捕獲錯誤bc空:

answer=$(echo "$expression" | bc 2>/dev/null) 
if [ -z "$answer" ]; then 
    echo "error in $expression" 
fi 
+0

不幸的是,這是不健壯。例如,follwoing會生成輸出,但應該被認爲是一個錯誤:echo'define foo(a){this is a syntax error}; 2 + 4'|公元前 – 2011-04-19 17:16:00