Bash

如何正確使用 bc 將百分比值轉換為浮點格式?

  • June 8, 2020

我有 3 個變數和值:

totalLines=14
outsideLines=6
multiplied=600

totalLines表示總行數(100%),而outsideLines表示時間戳值超出一定限制的行數。我的目的是計算那些外線的百分比。如果我這樣做:

percentage=$(( multiplied / totalLines))

和 echo $percentage,我得到結果:

42

但是,我想產生浮點數的百分比,如下所示:

42.85

我嘗試實現這一點:

percentage=$( bc <<< 'scale=2; $multiplied / $totalLines' )

失敗並出現以下錯誤:

(standard_in) 1: illegal character: $
(standard_in) 1: illegal character: $
(standard_in) 1: illegal character: L
(standard_in) 1: syntax error

我應該如何正確使用 bc 以獲得浮點數的百分比?

你可以這樣做:

percentage=$(echo "scale=2; $multiplied / $totalLines" | bc)

如果您需要做的只是(近似)百分比數學,您可以直接在大多數 shell 中使用:

➤ printf '%8.2f\n' "$((multiplied*100/totalLines))e-2"
42.85

而且,在 bash 中,您可以分配給這樣的變數:

➤ printf -v percentage '%.2f\n' "$((multiplied*100/totalLines))e-2"
➤ echo "$percentage"
42.85

對於具有兩位小數且沒有空格的百分比。

是的,shell 進行整數數學運算,但我們總是可以計算值乘以 100。

這將使$((…))整數的結果為 4285。

然後所需的只是將小數分隔符(點)向左移動兩個位置。

就是這個原因e-2,值會4285e-2

然後,將結果格式化為帶有兩位小數的浮點數%8.2f

或者,對於在許多 shell 中工作的稍慢的選項(由於子 shell),請使用:

percentage="$(printf '%8.2f\n' "$((multiplied*100/totalLines))e-2")"

這一切都在 shell 內完成(如果 printf 是內置的)。

不需要載入外部應用程序使這更快,並且 CPU 上的負載也更少(對於一個數字)。

不要嘗試將此擴展到 1000 個數字,shell 不是處理文本文件的正確收費。

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