按字面意思使用echo "20+5"
會產生文字“ 20+5
”。
25
在這種情況下,我可以使用什麼指令來取得數字總和?
另外,僅使用 bash 進行浮點運算最簡單的方法是什麼?例如,echo $((3224/3807.0))
列印0
:(。
我正在使用基本命令 shell(“命令列”)本身或透過使用命令列中可用的語言來尋找答案。
答案1
有很多選擇!
概括
$ printf %.10f\\n "$((10**9 * 20/7))e-9" # many shells. Not mksh.
$ echo "$((20.0/7))" # (ksh93/zsh/yash, some bash)
$ awk "BEGIN {print (20+5)/2}"
$ zcalc
$ bc <<< 20+5/2
$ bc <<< "scale=4; (20+5)/2"
$ dc <<< "4 k 20 5 + 2 / p"
$ expr 20 + 5
$ calc 2 + 4
$ node -pe 20+5/2 # Uses the power of JavaScript, e.g. : node -pe 20+5/Math.PI
$ echo 20 5 2 / + p | dc
$ echo 4 k 20 5 2 / + p | dc
$ perl -E "say 20+5/2"
$ python -c "print(20+5/2)"
$ python -c "print(20+5/2.0)"
$ clisp -x "(+ 2 2)"
$ lua -e "print(20+5/2)"
$ php -r 'echo 20+5/2;'
$ ruby -e 'p 20+5/2'
$ ruby -e 'p 20+5/2.0'
$ guile -c '(display (+ 20 (/ 5 2)))'
$ guile -c '(display (+ 20 (/ 5 2.0)))'
$ slsh -e 'printf("%f",20+5/2)'
$ slsh -e 'printf("%f",20+5/2.0)'
$ tclsh <<< 'puts [expr 20+5/2]'
$ tclsh <<< 'puts [expr 20+5/2.0]'
$ sqlite3 <<< 'select 20+5/2;'
$ sqlite3 <<< 'select 20+5/2.0;'
$ echo 'select 1 + 1;' | sqlite3
$ psql -tAc 'select 1+1'
$ R -q -e 'print(sd(rnorm(1000)))'
$ r -e 'cat(pi^2, "\n")'
$ r -e 'print(sum(1:100))'
$ smjs
$ jspl
$ gs -q <<< "5 2 div 20 add ="
細節
貝殼
您可以使用 POSIX 算術擴展整數算術echo "$((...))"
:
$ echo "$((20+5))"
25
$ echo "$((20+5/2))"
22
相當便攜(ash dash yash bash ksh93 lksh zsh
):
使用 printf 列印浮點數的能力,我們可以擴展大多數 shell 來進行浮點數學計算,儘管範圍有限(不超過 10 位數字):
$ printf %.10f\\n "$((1000000000 * 20/7 ))e-9"
2.8571428570
ksh93
,yash
和zsh
在這裡支援浮動:
$ echo "$((1.2 / 3))"
0.4
僅有的ksh93
(直接)和zsh
在這裡載入庫 mathfunc :
$ echo "$((4*atan(1)))"
3.14159265358979324
(zsh
需要加載zmodload zsh/mathfunc
才能獲得類似的功能atan
)。
與 zsh 交互:
$ autoload zcalc
$ zcalc
1> PI/2
1.5708
2> cos($1)
6.12323e-17
3> :sci 12
6.12323399574e-17
使用 (t)csh(僅限整數):
% @ a=25 / 3; echo $a
8
在rc
shell 家族中,akanga
是具有算術擴展的:
; echo $:25/3
8
POSIX 工具箱
bc
(互動模式見下文),手冊在這裡
助記符:bestc計算器(儘管b
實際上是基本的)。
$ echo 20+5/2 | bc
22
$ echo 'scale=4;20+5/2' | bc
22.5000
(支援任意精度數字)
bc互動模式:
$ bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
5+5
10
2.2+3.3
5.5
匆忙的解決方案,expr
(無互動模式):
$ expr 20 + 5
25
$ expr 20 + 5 / 2
22
約書亞的解決方案:awk
(無互動模式):
$ calc() { awk "BEGIN{print $*}"; }
$ calc 1/3
0.333333
其他或多或少的手提工具
阿爾切格的解決方案,dc
(互動模式:dc
):
這更有趣,因為它透過逆波蘭表示法工作。
$ echo 20 5 2 / + p | dc
22
$ echo 4 k 20 5 2 / + p | dc
22.5000
但除非你經常使用逆波蘭表示法,否則不太實用。
請注意,它dc
早於bc
並且bc
歷史上已作為包裝器實現dc
,但dc
並未由 POSIX 標準化
DQ尺寸的calc
(必需的sudo apt-get install apcalc)
:
$ calc 2 + 4
6
通用語言解釋器:
工作的人的解決方案,node
(互動模式:node
;不需要輸出功能):
$ node -pe 20+5/2 # Uses the power of JavaScript, e.g. : node -pe 20+5/Math.PI
22.5
珀爾(互動模式:perl -de 1
):
$ perl -E "say 20+5/2"
22.5
Python(互動模式:python
;不需要輸出功能):
$ python -c "print(20+5/2)"
22 # 22.5 with python3
$ python -c "print(20+5/2.0)"
22.5
也支援任意精度數字:
$ python -c 'print(2**1234)'
295811224608098629060044695716103590786339687135372992239556207050657350796238924261053837248378050186443647759070955993120820899330381760937027212482840944941362110665443775183495726811929203861182015218323892077355983393191208928867652655993602487903113708549402668624521100611794270340232766099317098048887493809023127398253860618772619035009883272941129544640111837184
如果你有clisp
安裝後,您也可以使用波蘭表示法:
$ clisp -x "(+ 2 2)"
馬可的解決方案,lua
(互動模式:lua
):
$ lua -e "print(20+5/2)"
22.5
PHP(互動模式:php -a
):
$ php -r 'echo 20+5/2;'
22.5
紅寶石(互動模式:irb
;不需要輸出功能):
$ ruby -e 'p 20+5/2'
22
$ ruby -e 'p 20+5/2.0'
22.5
詭計(互動模式:guile
):
$ guile -c '(display (+ 20 (/ 5 2)))'
45/2
$ guile -c '(display (+ 20 (/ 5 2.0)))'
22.5
俚語(交互模式:slsh
;不需要輸出函數,只是一個;
終止符):
$ slsh -e 'printf("%f",20+5/2)'
22.000000
$ slsh -e 'printf("%f",20+5/2.0)'
22.500000
鉈(互動模式:tclsh
;不需要輸出功能,但是expr
是):
$ tclsh <<< 'puts [expr 20+5/2]'
22
$ tclsh <<< 'puts [expr 20+5/2.0]'
22.5
JavaScript貝殼:
$ smjs
js> 25/3
8.333333333333334
js>
$ jspl
JSC: 25/3
RP: 8.33333333333333
RJS: [object Number]
JSC:
Good bye...
$ node
> 25/3
8.333333333333334
>
各種SQL:
SQLite(互動模式:sqlite3
):
$ sqlite3 <<< 'select 20+5/2;'
22
$ sqlite3 <<< 'select 20+5/2.0;'
22.5
MySQL:
mysql -BNe 'select 1+1'
PostgreSQL:
psql -tAc 'select 1+1
_mysql 和 postgres 上的選項停止「ascii art」映像!
專門的數學語言:
右在普通模式下 - 讓我們產生 1000 個常態隨機數並獲得標準差並列印它
$ R -q -e 'print(sd(rnorm(1000)))'
> print(sd(rnorm(1000)))
[1] 1.031997
右使用較小的腳本 - 讓我們列印 pi 的平方
$ r -e 'cat(pi^2, "\n")'
9.869604
$ r -e 'print(sum(1:100))'
[1] 5050
帕里/GP,一個用於數論、線性代數和許多其他事物的廣泛的計算機代數系統
$ echo "prime(1000)"|gp -q
7919 // the 1000th prime
$ echo "factor(1000)" | gp -q
[2 3]
[5 3] // 2^3*5^3
$ echo "sum(x=1,5,x)" | gp -q
15 // 1+2+3+4+5
GNU 倍頻程(一種高階解釋語言,主要用於數值計算)
還支持複數:
$ octave
>> 1.2 / 7
ans = 0.17143
>> sqrt(-1)
ans = 0 + 1i
茱莉亞,用於科學和數值計算的高效能語言和解釋器。
非互動式選項:
$ julia -E '2.5+3.7'
6.2
幽靈腳本
GhostScript 是一個 PostScript 解譯器,即使在非常舊的發行版中也很常見。
看PostScript 文檔查看支援的數學命令的清單。
互動範例:
$ GS_DEVICE=display gs
GPL Ghostscript 9.07 (2013-02-14)
Copyright (C) 2012 Artifex Software, Inc. All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
GS>5 2 div 20 add =
22.5
GS>
答案2
計算方法有很多種。對於簡單的表達式,您可以使用bash
自身:
echo $((20+5))
或者expr
:
expr 20 + 5
對於複雜的情況,有一個很棒的工具bc
:
echo "20+5" | bc
順便說一句,bc 甚至可以計算出非常複雜的表達式,包括根、對數、cos、sin 等。
答案3
還沒有人提到 awk 嗎?
使用 POSIX shell 函數和 awk 數學功能,只需定義這個(一行)函數:
calc(){ awk "BEGIN { print $*}"; }
然後只需執行類似calc 1+1
或的事情calc 5/2
注意:要使函數始終可用,請將其新增至 ~/.bashrc (或對應 shell 的啟動檔案)
當然,還有一個名為「calc」的小腳本,其中包含以下內容:
#!/bin/sh -
awk "BEGIN { print $* }"
也可以工作。
答案4
您可以使用calc
:
如果您只是輸入calc
而沒有其他參數,它將進入互動模式,您可以在其中繼續做數學。您可以輸入 exit 退出:
C-style arbitrary precision calculator (version 2.12.3.3)
Calc is open software. For license details type: help copyright
[Type "exit" to exit, or "help" for help.]
; 2+4
6
; 3+5
8
; 3.4+5
8.4
; 2^4
16
; exit
或者您將它與表達式一起用作參數,它將提供答案然後退出
$calc 2 + 4
6
$
calc
類似於bc
,我只是更喜歡它預設的行為方式