쉘에서 표현식을 평가하고 싶습니다. 다음 코드를 사용합니다.
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 프로세스가 존재하는 한 지속됩니다...