различные результаты расчета с использованием bc в скрипте и консоли - PullRequest
0 голосов
/ 19 февраля 2011

В сценарии я пишу сейчас, мне нужны некоторые десятичные вычисления, поэтому я решил использовать bc.Я не знаком с этим инструментом, так что простите меня, если вопрос тривиален.
Когда я использую консоль и набираю:

set r_m = `echo" scale = 6; $ pd_f *$ d_f * (1 / SQRT (3)) + ($ fr_numb-1) * ($ pd_f * $ d_f * (1 / SQRT (3)) + $ pd_f * $ d_f * 0,5 * (с (3,14159265 * 30 /180) / c (3.14159265 * 30/180))) + 0,4 "| bc -l`

, затем echo "$r_m" дает мне: 19.849870
($ pd_f и $ d_fбыли объявлены 1.129 и 1.126, соответственно, oh и $ fr_numb = 18)

, но (!), используя те же строки в скрипте bash:

r_m = `echo" scale = 6; $ pd_f * $ d_f * (1 / sqrt (3)) + ($ fr_numb-1) * ($ pd_f * $ d_f * (1 / sqrt (3)) + $ pd_f * $ d_f * 0.5 * (s (3.14159265 * 30/180) / c (3.14159265 * 30/180))) + 0,4 "| bc -l`

дает мне: .033022

Почему?

ОБНОВЛЕНИЕ Я поставил все после = в кавычках.Я не знал, как использовать их в цитате.

Оболочка bash 2.05

Ответы [ 4 ]

1 голос
/ 19 февраля 2011

Если в вашей оболочке установлено 3 переменные, например:

pd_f=1
d_f=2
fr_numb=3

и вы запускаете оригинальную команду:

set r_m=`echo "scale=6; $pd_f*$d_f*(1/sqrt(3))+($fr_numb-1)*($pd_f*$d_f*(1/sqrt(3))+$pd_f*$d_f*0.5*(s(3.14159265*30/180)/c(3.14159265*30/180)))+0.4"|bc -l`

, тогда вы получите $1, установленный на r_m=5.018798 (а все остальные позиционные параметры не определены). Это связано с тем, что в bash и во всех других производных оболочки Bourne оператор set используется для настройки параметров оболочки или установки значений позиционных параметров, $1, $2, ... и т. Д. (Но не $0).

Если у вас нет значений для трех переменных, вы получите синтаксические ошибки, диагностированные с помощью bc.

Обратите внимание, особенно, что исходная команда не устанавливает переменную r_m; это будет только установить переменную в оболочке C или производной оболочки C. На переменную оболочки $r_m оператор set совершенно не влияет. В результате в $r_m вы увидели то, что осталось в переменной из вашего предыдущего эксперимента.

С другой стороны, когда вы запускаете:

r_m=`echo "scale=6; $pd_f*$d_f*(1/sqrt(3))+($fr_numb-1)*($pd_f*$d_f*(1/sqrt(3))+$pd_f*$d_f*0.5*(s(3.14159265*30/180)/c(3.14159265*30/180)))+0.4"|bc -l`

затем вы присваиваете переменную r_m.

1 голос
/ 19 февраля 2011

Этот скрипт

#!/bin/bash

pd_f=1.129
d_f=1.126
fr_numb=18

r_m=`echo "scale=6; $pd_f*$d_f*(1/sqrt(3))+($fr_numb-1)*($pd_f*$d_f*(1/sqrt(3))+$pd_f*$d_f*0.5*(s(3.14159265*30/180)/c(3.14159265*30/180)))+0.4"|bc -l`

echo $r_m

выводит 19,849870 при

GNU bash, Version 4.1.5(1)-release (i686-pc-linux-gnu)
Copyright (C) 2009 Free Software Foundation, Inc.

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

1 голос
/ 19 февраля 2011

Я получаю результат .033022, когда fr_numb=0.

Кстати, ваша интерактивная команда, очевидно, выполняется в csh.Вы должны убедиться, что ваш скрипт имеет следующую строку в качестве первой строки, если вы хотите убедиться, что он запускается Bash:

#!/bin/bash

Кроме того, используйте некоторые пробелы и продолжение строки, чтобы сделать вашу формулу более читабельной.

#!/bin/bash
pd_f=1.129
d_f=1.126
fr_numb=18
fr_numb=0
r_m=$(echo "scale=6; \
    $pd_f*$d_f * (1 / sqrt(3)) + \
    ($fr_numb - 1) * ( \
        $pd_f * $d_f * (1 / sqrt(3)) + \
        $pd_f * $d_f * 0.5 * \
        ( \
            s(3.14159265 * 30 / 180) / c(3.14159265 * 30 / 180) \
        ) \
     ) + \
     0.4 " | bc -l)

Кстати, при публикации вопроса публикуйте назначения переменных, чтобы их можно было легко скопировать, чтобы ваши настройки можно было воспроизвести, а не в простом стиле, подобном "" ($ pd_f и $ d_f были объявлены 1.129и 1.126 соответственно, о, и $ fr_numb = 18) ", который требует интенсивного редактирования, чтобы его можно было использовать.

0 голосов
/ 19 февраля 2011

заключите вашу команду в $ ()

r_m=$(echo "scale=6; $pd_f*$d_f*(1/sqrt(3))+($fr_numb-1)*($pd_f*$d_f*(1/sqrt(3))+$pd_f*$d_f*0.5*(s(3.14159265*30/180)/c(3.14159265*30/180)))+0.4"|bc -l)
...