2013-05-01 1 views
2

Я использую команду bc в UNIX для анализа некоторых математических выражений. У меня есть две маленькие функции:bash: оценка команды 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: Ошибка синтаксического анализа» с.

Моя первая мысль заключалась в том, что звездочка была проблемой, поэтому я попытался убежать от нее. Это, однако, дало мне незаконную ошибку.

Решения закончилось тем, что удаление всех пробельного

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

ВОПРОСА: Почему расчет catMinusMouse (с пробелами вокруг оператора вычитания) работать в то время как в том же формат с умножением не работает?

+0

Попробуйте запустить 'echo 2 * 3' в непустом каталоге и посмотреть, можете ли вы это понять. – Mat

+0

Это интересно. Однако могу ли я сделать эту работу с помощью экранирования? Если я делаю '$ (bashcalc $ cat_radius \ * $ cos)', не мог бы я эффективно называть 'echo 2 \ * 2', который правильно экранирует * и не перечисляет каталог? – bobbyjoe93

+1

Проблема не на сайте вызова, она находится в расширении функции '$ @' в функции. Ответ jm666 охватывает его. – Mat

ответ

1

Try со следующим:

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

, то есть труба, bc (bashcalc) и он будет делать расчет.

+2

Это новое. Программа 'bc' предшествует Bash с большим отрывом, поэтому, независимо от названия, это, безусловно, не« Bash Calculator ». [Википедия] (http://en.wikipedia.org/wiki/Bc_programming_language) говорит, что это «базовый калькулятор». – tripleee

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