bash 함수를 사용하여 명령 행에서 간단한 수학 수행 : $ 1을 $ 2로 나눈 값 (bc 사용)


33

때로는 한 숫자를 다른 숫자로 나눌 필요가 있습니다. 이것을 위해 bash 함수를 정의 할 수 있다면 좋을 것입니다. 지금까지는 다음과 같은 표현식을 사용해야합니다.

echo 'scale=25;65320/670' | bc

그러나 다음과 같은 .bashrc 함수를 정의 할 수 있다면 좋을 것입니다.

divide () {
  bc -d $1 / $2
}

답변:


45

편리한 bash 함수가 있습니다 calc.

calc () {
    bc -l <<< "$@"
}

사용법 예 :

$ calc 65320/670
97.49253731343283582089

$ calc 65320*670
43764400

자신에게 맞게 이것을 변경할 수 있습니다. 예를 들면 다음과 같습니다.

divide() {
    bc -l <<< "$1/$2"
}

참고 : <<< A는 여기 문자열 의 표준 입력으로 공급된다 bc. 를 호출 할 필요는 없습니다 echo.


3
추가 에코가 없으면 더 좋아 보인다는 데 동의하지만 쉘이 내장되어 있기 때문에 추가 비용이 거의 들지 않습니다. 쉘 함수에서 '<<<'를 사용하지 못하게하는 것은 bash에 대한 제한이며 추가 에코는 원래 bourne 쉘 또는 ksh에서 변경없이 사용할 수 있습니다.
타티아나 Heuser

93- ksh변형 인 @TatjanaHeuser 는 here-string을 지원합니다.
Kusalananda

변수에 할당하기 위해 나는 이렇게했다 : foo = $ (bc -l <<< "(2 * 5) + 5")
thebiggestlebowski

20

배쉬는 수학 자체를 어느 정도 할 수 있습니다. 그러나 반올림하므로 정확도에는 유용하지 않습니다.

[user]$ echo $(( 10/5 ))
2

bash 함수는 간단한 지름길이며 예제는 기본적으로 작동합니다.

divide() {
  echo "scale=25;$1/$2" | bc
}

그것을 .bashrc에 던지면 다음을 수행 할 수 있습니다.

[user]$ divide 10 5
2.0000000000000000000000000

1
echo $((10 / 5))견적이 필요하지 않습니다.
사용자가 알 수 없음

1
상당한 성가심 : echo $((6383/7671)) 당신에게 0을 줄 것입니다. 당신은 부동 소수점 숫자에 대한 명시해야합니다echo $((6383.0/7671.0))
스리 Sarnobat

9

bash 내장 'expr'을 알고있을 것입니다.

$ expr 60 / 5
12

정수로 제한되며 인수 사이에 공백이 필요합니다.

이미 사용중인 에코 표현식의 선을 따라 함수를 정의하지 못하게하는 것은 무엇입니까? 즉

 divide () {
   echo $1/$2 | bc
 }

1
그냥 무지. 나는 그것이 그렇게 작동하게 만들 수 있다는 것을 몰랐다 ...
ixtmixilix

7

실제로이 정확한 질문에 대한 답은 아니지만 아는 것이 좋습니다. zsh;-) 사용

% echo $((65320./670))
97.492537313432834

zsh로 변경하고 bash의 expr내장 기능을 사용할 수 없으므로 실제로이 질문을 찾고있었습니다. :)
Steen Schütt

2

이 경우 calc시스템에 설치하고 반올림 좋아하지 않아, 당신은 할 수 있습니다 :

div() { calc "$1 / $2"; }

흠 ... 'calc'에 대한 데비안 패키지를 찾을 수 없습니다
ixtmixilix

패키지는 apcalc (임의 정밀도) 라고 불립니다 ... 바이너리는calc
Peter.O

@ Peter.O Ok, 아치 리눅스 저장소에서는이라고 calc합니다.

2

bc를 사용하지 않고 작은 값과 제한된 정밀도에 대한 더러운 핵은 정확한 결과를 얻기 위해 나누기 전에 지명자를 곱하는 것입니다.

정밀도없는 예 :

echo $((13/7)) 
1

그리고 두 자리 정밀도로 : 100을 곱하고 소수점을 2 단계 왼쪽으로 이동하십시오.

echo $((100*13/7)) | sed 's/..$/.&/'
1.85
echo $((100*13/7))%
185%

이것은 숫자의 범위가 이전에 알려져 있고 정밀도가 항상 동일한 경우에만 유용합니다. bc 를 호출 하지 않고 sed를 호출하는 것은 그리 합리적이지 않은 것 같습니다.

값을 곱하면 오버플로 오류가 발생할 수 있지만 매우 빠르지는 않습니다.

echo $((1000000000*12345678901))
-6101065172709551616

수학 식을 평가하기 위해 이중 괄호를 사용하는 것은 더 이상 사용되지 않습니다. 사용 : $[expression]대신
laebshade

3
@ laebshade : 나는 당신을 잘못 증명할 수 있습니다, 그 반대입니다. 다음은 bash 매뉴얼의 인용입니다 :The old format $[expression] is deprecated and will be removed in upcoming versions of bash.
사용자 불명

여기 ,  여기  및  여기 에서도 논의 되었습니다 .
G-Man, 'Reinstate

0

bc를 사용하는 대신 awk를 사용할 수 있습니다.

div() { awk -v p=$1 -v q=$2 'BEGIN{print p/q}'; }

-4
echo Division
efgh=$num1/$num2
remainder=$num1%num2
echo $num1 "/" $num2 "=" $efgh.$remainder
echo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.