[bash] bash에서 부동 소수점 나누기를 어떻게 사용합니까?

Bash 스크립트에서 두 이미지 너비를 나누려고하지만 bash는 나에게 0 결과를 제공합니다.

RESULT=$(($IMG_WIDTH/$IMG2_WIDTH))

나는 Bash 가이드를 공부 bc했고 인터넷에서 사용 하는 모든 예제에서 사용해야한다는 것을 알고있다 bc. 에echo 내에서 같은 일을 넣어 시도 SCALE했지만 작동하지 않았다.

튜토리얼에서 찾은 예제는 다음과 같습니다.

echo "scale=2; ${userinput}" | bc 

Bash가 어떻게 플로트를 줄 수 0.5있습니까?



답변

당신은 할 수 없습니다. bash는 단지 정수를 않습니다; 당신은 해야한다 와 같은 도구에 위임 bc.


답변

당신은 이것을 할 수 있습니다 :

bc <<< 'scale=2; 100/3'
33.33

업데이트 20130926 : 당신은 사용할 수 있습니다 :

bc -l <<< '100/3' # saves a few hits


답변

세게 때리다

다른 사람들이 지적했듯이 bash부동 소수점 산술을 지원하지 않지만 소수 자릿수와 같은 고정 소수점 속임수로 위조 할 수는 있습니다 (예 : 두 개의 소수점 이하)

echo $(( 100 * 1 / 3 )) | sed 's/..$/.&/'

산출:

.33

참조 Nilfred의 대답을비슷하지만 더 간결한 접근법에 을 .

대안

언급 bcawk대안 외에도 다음이 있습니다.

절정

clisp -x '(/ 1.0 3)'

정리 된 출력으로 :

clisp --quiet -x '(/ 1.0 3)'

또는 stdin을 통해 :

echo '(/ 1.0 3)' | clisp --quiet | tail -n1

dc

echo 2k 1 3 /p | dc

천재 cli 계산기

echo 1/3.0 | genius

고스트 스크립트

echo 1 3 div = | gs -dNODISPLAY -dQUIET | sed -n '1s/.*>//p' 

gnuplot

echo 'pr 1/3.' | gnuplot

jq

echo 1/3 | jq -nf /dev/stdin

또는:

jq -n 1/3

ksh

echo 'print $(( 1/3. ))' | ksh

루아

lua -e 'print(1/3)'

또는 stdin을 통해 :

echo 'print(1/3)' | lua

맥시마

echo '1/3,numer;' | maxima

정리 된 출력으로 :

echo '1/3,numer;' | maxima --quiet | sed -En '2s/[^ ]+ [^ ]+ +//p'

마디

echo 1/3 | node -p

옥타브

echo 1/3 | octave

echo print 1/3 | perl

python2

echo print 1/3. | python2

python3

echo 'print(1/3)' | python3

아르 자형

echo 1/3 | R --no-save

정리 된 출력으로 :

echo 1/3 | R --vanilla --quiet | sed -n '2s/.* //p'

루비

echo print 1/3.0 | ruby

wcalc

echo 1/3 | wcalc

정리 된 출력으로 :

echo 1/3 | wcalc | tr -d ' ' | cut -d= -f2

zsh

echo 'print $(( 1/3. ))' | zsh

단위

units 1/3

컴팩트 한 출력으로 :

units --co 1/3

다른 출처

Stéphane Chazelas 는 Unix.SX 에서 비슷한 질문에 답변 했습니다.


답변

marvin의 답변을 조금 개선 :

RESULT=$(awk "BEGIN {printf \"%.2f\",${IMG_WIDTH}/${IMG2_WIDTH}}")

bc가 항상 설치된 패키지로 제공되는 것은 아닙니다.


답변

-l옵션으로 bc를 사용할 수 있습니다 (L 문자)

RESULT=$(echo "$IMG_WIDTH/$IMG2_WIDTH" | bc -l)


답변

bc의 대안으로 스크립트 내에서 awk를 사용할 수 있습니다.

예를 들면 다음과 같습니다.

echo "$IMG_WIDTH $IMG2_WIDTH" | awk '{printf "%.2f \n", $1/$2}'

위의 “% .2f”는 소수점 이하 두 자리의 부동 소수점 숫자를 반환하도록 printf 함수에 지시합니다. awk가 올바르게 작동하기 때문에 echo를 사용하여 변수를 필드로 파이프했습니다. “$ 1″및 “$ 2″는 awk에 입력 된 첫 번째 및 두 번째 필드를 나타냅니다.

그리고 다음을 사용하여 결과를 다른 변수로 저장할 수 있습니다.

RESULT = `echo ...`


답변

부동 소수점 수학을 포함한 많은 추가 기능을 갖춘 (거의) bash 수퍼 세트 인 zsh를 사용해 볼 수있는 완벽한 시간입니다. 다음은 zsh의 예제와 같습니다.

% IMG_WIDTH=1080
% IMG2_WIDTH=640
% result=$((IMG_WIDTH*1.0/IMG2_WIDTH))
% echo $result
1.6875

이 게시물은 당신을 도울 수 있습니다 : bash-캐주얼 사용을 위해 zsh로 전환 할 가치가 있습니까?