如何在 #!/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.6785,678将取决于区域设置($LC_ALL$LC_NUMERIC$LANG变量)和实现awk(其中一些将.无论区域设置如何使用)。

对于 的 GNU 实现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在法语语言环境中无法理解,因为那里有十进制基数,,而不是.)。

在您似乎正在使用的 busybox 实现中,需要使用 ,来--标记选项的结尾,awk因为它在非选项参数之后接受选项,这使得它不符合 POSIX 标准。如果没有它,如果$x$y是负数,上面的方法将不起作用。

或者,您可以再次设置$POSIXLY_CORRECT,这将强制它以标准方式解析其选项。请注意,在任何情况下,busyboxawk始终使用.小数基数字符,无论区域设置如何,也无论$POSIXLY_CORRECT.

答案2

您可以使用以下dc代码片段来获取结果:

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

相关内容