bc의 결과를 변수에 전달하는 방법


15

스크립트를 작성 중이며 결과를 bc변수 에 전달하고 싶습니다 . 2 개의 변수 ( var1var2)를 선언 하고 값을 지정했습니다. 내 스크립트에서 다른 계산 을 위해 작업 할 수 있도록 bc다른 변수에 결과를 전달하고 싶습니다 . 지금까지 내가 찾고있는 파일이 아닌 파일에 결과를 쓸 수 있었고 터미널에서 결과를 반향 할 수 있었지만 결과를 변수에 즉시 전달하고 싶습니다. 그 변수로 작업 할 수 있습니다.var3var3

echo "scale=2;$var1/var2" | bc

답변:


23

bash를 사용하는 경우 다음과 같이 파이프 대신 here 문자열을 사용하는 것이 좋습니다.

bc <<< "scale=2;$var1/$var2"

그러면 서브 쉘이 절약됩니다.

그런 다음 명령의 출력을 저장하려면 명령 대체를 사용하십시오.

answer=$(bc <<< "scale=2;$var1/$var2")

편집하다.

보다 더 멋진 것을 원한다면 bcdc (역 폴란드 계산기)가 있습니다.

answer=$(dc <<< "2k $var1 $var2/p")

1
예, bash를 사용하고 있습니다. 서브 쉘에서 명확하게 설명해 주시겠습니까? 단점이 있습니까?
shaolin

2
파이프를 사용할 때마다 파이프 |오른쪽의 명령이 서브 쉘에서 실행되며, 새로운 서브 쉘을 여는 데 자원이 필요합니다 (해당 명령을 실행하기 위해 새 bash 인스턴스를 여는 것과 같습니다). 피할 수 있다면 피하십시오. 여기서,이 배관 echobc명령을 실행 bcbash는이 멋진 여기에 문자열 구조가 있기 때문에 서브 쉘에서이며, 어떤 의미에서, (악의)을 지체하지 <<<이런 바보 같은 짓을 피할 수 있습니다.
gniourf_gniourf

@gniourf_gniourf 그런 다음 리소스 사용에 관심이 있다면 /bin/shbash 대신 (대시)를 사용하지만 dash에는 없습니다 <<<.
Gilles 'SO- 악한 중지

유용한 정보에 감사드립니다 !! 이것은 자원 및 서브 쉘 보존에 관해 알아야 할 좋은 정보입니다. 입력 해 주셔서 감사합니다.
shaolin

1
@Gilles은 비교 time for i in {1..10000}; do : <<< ""; donetime for i in {1..10000}; do echo "" | : ; done는 극적인 차이를 볼 수 있습니다. 그렇다면 당신은 옳습니다. heredoc은 herestring보다 약간 빠릅니다. 그러나 하나의 라이너로 입력하는 것이 더 어색합니다.
gniourf_gniourf

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.