Linux
如何在#!/bin/sh 中將數字除以浮點數並返回
嗨,我必須將兩個數字除以
#!/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.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
.