Argghh:有沒有一個好的工具來解析/評估數學表達式?
$ echo 2 4 | bc (standard_in) 1: parse error $ echo $? 0
究竟爲什麼會在識別語法錯誤,否則完全合理的計劃成功嗎?顯然,我不能用bc來評估表達式。就我個人而言,我喜歡dc,但我的用戶不想要反向擦亮。鑑於bc認可的形式的算術表達式,是否有合理的評估結果的程序?或者有沒有辦法讓bc合理? (在這裏,「合理的」意思是當輸入是僞造的時候它會失敗。)
Argghh:有沒有一個好的工具來解析/評估數學表達式?
$ echo 2 4 | bc (standard_in) 1: parse error $ echo $? 0
究竟爲什麼會在識別語法錯誤,否則完全合理的計劃成功嗎?顯然,我不能用bc來評估表達式。就我個人而言,我喜歡dc,但我的用戶不想要反向擦亮。鑑於bc認可的形式的算術表達式,是否有合理的評估結果的程序?或者有沒有辦法讓bc合理? (在這裏,「合理的」意思是當輸入是僞造的時候它會失敗。)
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
您可以通過查看stderr輸出,或者通過將stderr重定向到/ dev/null並識別輸出時捕獲錯誤bc
空:
answer=$(echo "$expression" | bc 2>/dev/null)
if [ -z "$answer" ]; then
echo "error in $expression"
fi
不幸的是,這是不健壯。例如,follwoing會生成輸出,但應該被認爲是一個錯誤:echo'define foo(a){this is a syntax error}; 2 + 4'|公元前 – 2011-04-19 17:16:00