2013-05-01 166 views
2

我在UNIX使用BC命令來分析一些數學表達式bc命令的評價。我有兩個小功能:慶典:*

function bashcalc { 
     echo [email protected] | bc -l 
} 

function2 { 
     ... 
     catMinusMouse=$(bashcalc "$cat_angle - $mouse_angle") 
     cos=$(cosine $catMinusMouse) 
     val=$(bashcalc "$cat_radius * $cos") ##PARSE ERROR 
     ... 
} 

當我試圖運行下面的數值的表達,我得到了不少「(standard_in)1:解析錯誤」 S。

我首先想到的是,星號是問題,所以我試圖逃避它。然而,這給了我一個非法的字符錯誤。

該解決方案最終被刪除所有空白的

val=$(bashcalc "$cat_radius*$cos") 

問:爲什麼計算catMinusMouse(與周圍的減法運算符空格)工作,同時與乘法相同的格式沒有工作?

+0

嘗試在非空目錄中運行'echo 2 * 3'並查看是否可以計算出結果。 – Mat 2013-05-01 09:54:08

+0

這很有趣。但是,我可以使用轉義工作來完成這項工作嗎?如果我做'$(bashcalc $ cat_radius \ * $ cos)',我不會有效地調用'echo 2 \ * 2',它正確地轉義*並且不會列出目錄嗎? – bobbyjoe93 2013-05-01 10:21:13

+1

問題不在呼叫站點,它在函數中的'$ @'擴展中。 jm666的答案涵蓋了它。 – Mat 2013-05-01 10:25:53

回答

1

嘗試以下操作:

val=$(echo "$cat_radius * $cos"| bc) 

就是管bc(bashcalc),它會進行計算。

+2

這是新的。程序'bc'大大超過了Bash,所以無論名字代表什麼,它肯定不是「Bash Calculator」。 [Wikipedia](http://en.wikipedia.org/wiki/Bc_programming_language)說這是「基本計算器」。 – tripleee 2013-05-01 10:42:48

2

你需要躲避*或將其封裝成「引號」

3變種:

#!/bin/bash 

function bashcalc { 
    echo "[email protected]" | bc -l 
} 

function2() { 
    cat_radius=0.9 
    catMinusMouse=0.4 

    val=$(bashcalc "$cat_radius" "*" "c($catMinusMouse)") 
    echo $val 

    #or 
    val=$(bashcalc "$cat_radius * c($catMinusMouse)") 
    echo $val 

    #or 
    val=$(bc -l <<EOF 
$cat_radius * c($catMinusMouse) 
EOF 
) 
    echo $val 
} 

function2 
+1

你應該在這裏正確地加倍引用所有的變量擴展,但是牛肉是使用'「$ @」'pro bare'$ @'。 – tripleee 2013-05-01 10:44:27