Linux

如何在#!/bin/sh 中將數字除以浮點數並返回

  • August 27, 2019

嗨,我必須將兩個數字除以#!/bin/sh

$x = 5678
$x/1000

但計算只返回整數:5

我需要5,678

我試過了

$x/1000.0 
$x/1000.0 | bc

第一種方法期望整數

第二種方法:我沒有bc

您可以使用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.

引用自:https://unix.stackexchange.com/questions/537598