Bash
如何在 shell 腳本中計算值?
我在終端中執行這個命令:
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}'