Bash
如何正確使用 bc 將百分比值轉換為浮點格式?
我有 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 不是處理文本文件的正確收費。