안녕하세요, 두 개의 숫자를 나누어야 해요#!/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
그것이 없으면 $x
or 가$y
음수이면 위의 방법은 작동하지 않습니다.
또는 다시 설정할 수 있으며 $POSIXLY_CORRECT
, 그러면 표준 방식으로 옵션을 구문 분석하게 됩니다. busybox는 awk
로케일 .
및 $POSIXLY_CORRECT
.
답변2
다음 dc
코드 조각을 사용하여 결과를 얻을 수 있습니다.
$ dc -e "3k $x 1000/p"