Bash

如何在 shell 腳本中計算值?

  • September 2, 2015

我在終端中執行這個命令:

grep "bla bla blah" blah* | echo "Blah: $(wc -l) / $(ls | wc -l) * 100"

我得到這個輸出:

Blah: 44 / 89 * 100

我期望看到的:

49.4

有沒有辦法只使用 bash 命令獲得所需的輸出?我不喜歡我打算通過管道輸出的腳本。

您的程式碼說要列印一個字元串。它沒有在任何地方說這個字元串實際上是您想要評估的算術表達式。所以你不能合理地期望你的表達式被評估。

您的程式碼不是最理想的。$(wc -l)將計算返回的匹配數grep,但有一種更簡單的方法:grep -c改為執行。$(ls | wc -l)是計算目前目錄中非點文件的一種不可靠的方法,因為的輸出ls不可靠$(set -- *; echo $#)是一種可靠的方法(假設至少有一個匹配的文件;如果該假設可能不成立,請使用$(set -- *; if [ -e "$1" ]; then echo $#; else echo 0; fi,但請注意,這將導致除以零以下,您應該以一種或另一種方式將其視為錯誤條件)。所以你可以這樣寫你的程式碼:

matches=$(grep -c "bla bla blah" blah*)
files=$(set -- *; echo $#)
echo "Blah: $matches / $files * 100"

或者您可以內聯計算兩個中間值:

echo "Blah: $(grep -c "bla bla blah" blah*) / $(set -- *; echo $#) * 100"

現在,要執行算術運算,您可以使用 shell 的內置算術擴展,但它僅限於整數運算,因此/運算符將向下舍入到最接近的整數。

echo "Blah: $(($matches * 100 / $files))"

在 ksh93、zsh 和 yash 中,但不是在其他 shell 中,如果表達式中存在強制浮點的內容,例如浮點常量,您將獲得浮點運算。此功能在 Bourne shell、ksh88、pdksh、bash、ash 中不存在。

echo "Blah: $(($matches * 100.0 / $files))"

bc實用程序以任意精度對十進制數執行操作。

echo "Blah: $(echo "scale=2; $matches * 100 / $files" | bc)"

另一個可以執行浮點計算(可用的數學函式較少)的標準實用程序是awk.

echo "$matches" "$files" | awk '{print "Blah:", $1 * 100 / $2}'

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