嗨,我必须将两个数字相除#!/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 实现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"