#!/bin/sh에서 숫자를 나누고 부동 소수점으로 반환하는 방법

#!/bin/sh에서 숫자를 나누고 부동 소수점으로 반환하는 방법

안녕하세요, 두 개의 숫자를 나누어야 해요#!/bin/sh

$x = 5678
$x/1000

그러나 계산은 정수만 반환합니다: 5.

나는해야합니다 5,678.

나는 노력했다

$x/1000.0 
$x/1000.0 | bc

첫 번째 방법은 정수를 기대합니다

두 번째 방법: 하나도 없습니다 bc.

답변1

당신은 그것을 사용할 수 있습니다 awk:

#! /bin/sh -
x=5678 y=1000
awk -- 'BEGIN{printf "%.3f\n", ARGV[1]/ARGV[2]}' "$x" "$y"

이를 얻을지 여부는 5.678로케일 5,678( $LC_ALL, $LC_NUMERIC, $LANG변수) 및 구현 awk(일부는 .로케일에 관계없이 사용됨)에 따라 달라집니다.

GNU 구현의 경우 로케일의 10진수 기본 문자를 따르도록 변수를 해당 환경에 전달 awk해야 합니다 .POSIXLY_CORRECT

이는 숫자 입력에도 적용됩니다.

$ LC_ALL=fr_FR.UTF-8 POSIXLY_CORRECT=1 gawk -- 'BEGIN{
   printf "%.3f\n", ARGV[1]/ARGV[2]}' 1,2 10
0,120
$ LC_ALL=fr_FR.UTF-8 POSIXLY_CORRECT=1 gawk -- 'BEGIN{
   printf "%.3f\n", ARGV[1]/ARGV[2]}' 1.2 10
0,100

(후자의 경우 는 문자열을 숫자로 명시적으로 변환할 때( 여기서 산술 연산자를 사용할 때와 같이) 유효한 숫자를 생성하고 무시하는 한 최대한 많이 구문 분석하기 때문에 1.2로 해석됩니다. 문자열의 나머지 부분은 다음과 같습니다. 프랑스어 로케일에서는 대신 소수점이 있기 때문에 이해할 수 없습니다 .1/awk.2,.

비지박스 구현에서는 옵션이 아닌 인수 다음에 옵션을 허용하므로 POSIX와 호환되지 않기 때문에 --옵션의 끝을 표시 하려면 를 사용해야 합니다 . awk그것이 없으면 $xor 가$y 음수이면 위의 방법은 작동하지 않습니다.

또는 다시 설정할 수 있으며 $POSIXLY_CORRECT, 그러면 표준 방식으로 옵션을 구문 분석하게 됩니다. busybox는 awk로케일 .$POSIXLY_CORRECT.

답변2

다음 dc코드 조각을 사용하여 결과를 얻을 수 있습니다.

$ dc -e "3k $x 1000/p"

관련 정보