긴 표현에 관한 BC 질문

긴 표현에 관한 BC 질문

쉘에서 표현식을 평가하고 싶습니다. 다음 코드를 사용합니다.

pi=$(echo "scale=10; 4*a(1)" | bc -l)
i=3
d=`expr (1+c($pi*($i/10)+$pi))/2 | bc -l`

하지만 그것은 말한다

bad pattern: (1+c(3.1415926532*(3/10)+3.1415926532))/2

왜?

답변1

이전 명령에서 사용한 곳에서는 expr아마도 echo.

$(…)PS 두 명령 모두에서 해당 형식 bc(대신 )을 사용하는 것이 좋습니다 `…`.

답변2

배율을 설정하는 위치는 계산에 영향을 미칩니다.

이 스크립트는 다음과 같습니다.

bc -l << \EOF
scale = 10
pi = 4 * a(1)
i = 3
(1 + c(pi * (i / 10) + pi)) / 2
EOF

bc -l << \EOF
pi = 4 * a(1)
i = 3
scale = 10
(1 + c(pi * (i / 10) + pi)) / 2
EOF

bc -l << \EOF
pi = 4 * a(1)
i = 3
r = (1 + c(pi * (i / 10) + pi)) / 2
scale = 10
r/1
EOF

bc -l << \EOF
scale = 100
pi = 4 * a(1)
i = 3
r = (1 + c(pi * (i / 10) + pi)) / 2
scale = 15
r/1
EOF

산출:

.2061073736
.2061073739
.2061073738
.206107373853763

답변3

내 조언을 따르면 `` 또는 $()- 그건 좀 어리석은 짓입니다. bc대화형, 라인 지향 인터프리터입니다. 표준 입력에서 한 줄을 읽고, 방금 읽은 입력을 기반으로 다른 줄이 필요한지 확인한 다음 그 결과를 표준 출력으로 인쇄하거나 표준 입력에 대한 추가 정보를 묻는 메시지를 표시합니다. 쉘과 마찬가지로 터미널이 아닌 다른 곳에 기록되더라도 라인 버퍼 출력 이외의 작업을 거부합니다. bc각 계산마다 새로운 것을 호출할 필요가 전혀 없습니다 . 특히 명령 대체에서는 더욱 그렇습니다.반품완전히 새로운 셸을 호출하고 새 파이프를 할당하는 작업이 포함됩니다.

가장 좋은 방법은 협업 프로세스를 설정하는 것입니다.

# in a bash shell
exec 8<> >( : ) 9< <( bc <&8 )
echo 'b=5;++b' >&8
read  b <&9
echo "$b"

6

그리고 계속 실행됩니다 bc. 짧은 수명의 명령 대체 프로세스 사이를 오가며 많은 작업을 수행하는 모든 변수 값을 bc중앙에 보다 쉽게 ​​저장할 수 있습니다 bc.

echo b\*b >&8; read b <&9; echo "$b"

32

더 좋은 점은 제가 이 방법을 지난번에 배웠기 때문에 bc소켓 서버에 프로세스를 넣을 수 있다는 것입니다.

{ ncat -l 9000 --allow localhost -k| bc; } <>/dev/fd/1 |:&

다음 언어를 사용하는 쉘을 사용하십시오 /dev/tcp.

{ echo 'b=10;b' >&0; read b; echo "$b"; } <>/dev/tcp/localhost/9000

10

이것은 약간 번거로울 수 있습니다. 나는 다음과 같은 작은 함수를 작성했습니다.bchat()일을 더 쉽게 만드십시오.

bchat(){
        local IFS=\;                                 ### separate on ;
        printf ${1+'%s;"\n"\n';}"$*"                 ### print \0 if no args
        set --                                       ### init  args
        while  read   bchat       &&                 ### while read <bc
              "${bchat:+set}" -- "$@" "${bchat:=$*}" ### append to args
        do :;  done 2>/dev/null                      ### and done
}       <>"$BC" >&0                                  ### $BC must be set

위와 같이 소켓 서버를 설정한 후 이 기능을 사용할 수 있습니다. 예를 들면 다음과 같습니다.

BC=/dev/tcp/localhost/9000
bchat b=5 x='(b--)' '"x="' ++x '"b="' --b
echo "$bchat" 

x=6;b=3

...다시 말하지만, 이 상태는 bc 프로세스가 존재하는 한 지속됩니다...

관련 정보