Máy tính dòng lệnh đơn giản


19

Vấn đề:

Thỉnh thoảng tôi cần làm số học đơn giản trong môi trường dòng lệnh. EG đưa ra đầu ra sau:

Disk /dev/sdb: 256GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size    File system     Name  Flags
 1      1049kB  106MB   105MB   fat32                 hidden, diag
 2      106MB   64.1GB  64.0GB  ext4
 3      64.1GB  192GB   128GB   ext4
 5      236GB   256GB   20.0GB  linux-swap(v1)

Cách đơn giản để tính toán trên dòng lệnh kích thước của không gian chưa phân bổ giữa phân vùng 3 và 5 là gì?

Những gì tôi đã thử:

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'. 
236-192
44
quit

trong đó chữ in đậm ở trên là tất cả những thứ tôi cần gõ để làm một cách đơn giản 236-192như bc 1+1tiếng vangFile 1+1 is unavailable.

expr

expr 236 - 192

nơi tôi cần nhập khoảng trắng trước và sau toán tử như expr 1+1tiếng vang 1+1.


3
Nếu bạn có ý định làm điều này một cách tương tác, bạn không cần phải nhập quitvào bc; nhấn ctrl-Dsẽ làm, như nó sẽ trong bất kỳ chương trình tương tác.
marcelm

2
dclà (IMO) vượt trội hơn nhiều so với bc.
William Pursell

1
Tôi nghĩ rằng không gian chưa phân bổ giữa ptn 3 và 5 nên là 236 - 192 chứ không phải 236 - 128?
Chấn thương kỹ thuật số

@DigitalTrauma mắt tốt! (Đó chỉ là một ví dụ và không ai phát hiện ra điều đó!)
Fabby

1
@JanM. Tôi là người đã nâng đỡ .... ;-)
Fabby

Câu trả lời:


33

Bạn có thể giảm đáng kể số lượng chi tiết liên quan đến việc sử dụng bc:

$ bc <<<"236-192"
44
$ bc <<<"1+1"
2

(giả sử vỏ của bạn hỗ trợ điều đó).

Nếu bạn muốn có chức năng đó:

$ c() { printf "%s\n" "$*" | bc }
$ c 1+1
2

Lưu cđịnh nghĩa trong tệp khởi động shell yêu thích của bạn nếu bạn muốn làm cho nó luôn có sẵn.


2
bc<RET>236-128<RET>quit<RET>là 16 tổ hợp phím. bc<<<"236-128"<RET>là 15 tổ hợp phím. Không phải cái mà tôi gọi là "số lượng gõ giảm đáng kể" :-) Ngoài ra, bccó thể thoát được ^D, vì vậy tùy chọn đầu tiên được giảm xuống còn 13 lần nhấn phím (tính ^Dlà hai).
L. Levrel

Phải, đó là nhiều hơn về tính dài dòng ;-).
Stephen Kitt

2
@ L.Levrel Với chức năng, c 1+1đó chính là thứ tôi cần! :-) (câu trả lời được cập nhật để làm cho rõ ràng hơn)
Fabby

Và nếu bạn thực hiện dấu phẩy động: c 'scale = 2; 17/3 '(hoặc tốt hơn, có tỷ lệ một biến được sử dụng bên trong hàm' c () 'và xác định giá trị của nó bất cứ khi nào bạn cần có n chữ số thập phân. Mặc định là 0.)
Olivier Dulac

1
Thay vì sử dụng bc -ltrong định nghĩa hàm để làm cho nó có khả năng hơn.
Isaac

22

Vỏ

Các đơn giản nhất calc trong CLI là CLI (vỏ) bản thân (Nếu IFSlà mặc định):

$ echo $(( 22 + 333 ))
355

Không gian có thể được bỏ qua:

$ echo $((22*333))
7326

Vì nó là một phần của POSIX nên hầu hết các vỏ đều có nó. Và nó bao gồm hầu hết các chức năng toán học ngôn ngữ C (ngoại trừ zsh có quyền ưu tiên khác, đặt C_PRECEDENCES để khôi phục nó về giá trị tương thích):

$ echo $((22*333^2))
7324

một số shell có hầu hết cú pháp toán học ngôn ngữ C (bao gồm cả dấu phẩy):

$ echo $((a=22,b=333,c=a*b,c))
7326

Nhưng nó chỉ là toán học số nguyên (và thường ít hơn 2 63 trong các hệ điều hành ngày nay) trong một số hệ vỏ:

$ echo $((1234/3))
411

$ zsh -c 'echo $((2**63))'
-9223372036854775808

Một số shell có thể làm toán nổi:

$ ksh -c 'echo $((1234/3.0))'
411.333333333333333

$ ksh -c 'echo $((12345678901234567890123/3.0))'
4.11522630041152263e+21

Tránh zsh (zcalc có vấn đề tương tự):

$ zsh -c 'echo $((12345678901234567890123 + 1))'
zsh:1: number truncated after 22 digits: 12345678901234567890123 + 1
-1363962815083169259

Tôi khuyên bạn nên tránh expr, đôi khi nó cần những lối thoát kỳ lạ:

$ expr 22 \* 333
7326

bc

Ở cấp độ tiếp theo là ( cũng là POSIX ) bc(anh em họ của RPN dc)

$ echo '22*333' | bc
7326

$ echo '22 333 * p' | dc
7326

Đó dc POSIX nhưng đã bị gỡ bỏ vào năm 2017 .

Ngắn hơn nếu shell của bạn hỗ trợ nó:

$ bc <<<'22*333'
7326

Hoặc thậm chí:

$ <<<'22*333' bc
7326

Cả hai đều là máy tính chính xác tùy ý với một số hàm toán học bên trong:

$ bc <<<2^200
1606938044258990275541962092341162602522202993782792835301376

$ echo 's(3.1415/2)' | bc -l        # sine function
.99999999892691403749

ôi

Sau những công cụ calc thực sự cơ bản đó , bạn cần phải đi đến các ngôn ngữ khác

$ awk "BEGIN {print (22*33)/7}"
103.714

$ perl -E "say 22*33/7"
103.714285714286

$ python3 -c "print(22*33/7)"
103.71428571428571

$ php -r 'echo 22*33/7,"\n";'
103.71428571429

chức năng

Bạn có thể xác định chức năng của bất kỳ tùy chọn nào ở trên:

c () 
{ 
    local in="$(echo " $*" | sed -e 's/\[/(/g' -e 's/\]/)/g')";
    gawk -M -v PREC=201 -M 'BEGIN {printf("%.60g\n",'"${in-0}"')}' < /dev/null
}

Và sử dụng:

$ c 22* 33 /7                   # spaces or not, it doesn't matter.
103.714285714285714285714285714285714285714285714285714285714

20

Đọc các trang này nhận xét , tôi thấy một chương trình UNIX / Linux được gọi là calcchính xác những gì bạn muốn. Nếu trên Debian / Ubuntu / dẫn xuất:

sudo apt-get install apcalc

sau đó bạn có thể:

calc 236-192

và nếu bạn thêm một bí danh alias c='calc'cho .bashrchoặc /etc/bash.bashrcsau đó nó sẽ trở thành:

c 1+1

trên dòng lệnh.


1
Không hoàn hảo, nhưng đủ tốt cho một upvote. Hiểu lầm được sửa chữa trong trò chuyện và downvote bị xóa bởi người dùng khác . Đã xóa câu trả lời (kém hơn) của riêng tôi ... ;-)
Fabby


9

Các unitschương trình, trong khi không có ý định để được sử dụng như một máy tính, thực sự hoạt động khá tốt như một.

$ units "236-192"
    Definition: 44
$ 

Nếu có khoảng trắng trong biểu thức, thì biểu thức phải được bảo vệ trích dẫn.
Nó hỗ trợ hàm mũ và lồng sâu của dấu ngoặc


3
Nó linh hoạt: units -t -d 10 "236GB - 192GB" GBđầu ra 44, units -t -d 15 "236GB - 192GB" bytesđầu ra 44000000000, v.v.
agc

6

Như đã nhận xét trong một nhận xét cho một câu trả lời trước đó, shell (ba) sh tiêu chuẩn cho phép đánh giá các biểu thức số học bên trong $((...)). Tôi không thể kiểm tra kỹ xem đây có phải là một phần của tiêu chuẩn POSIX hay không, nhưng tôi đã kiểm tra xem nó có hoạt động trên Cygwin và vỏ Mingw32 không.

Để xem kết quả, bạn thực sự phải gõ echo $((...)), điều này làm cho một số ký tự nhiều hơn (sử dụng tương tác) bc. Tuy nhiên, để sử dụng kết quả trong một tập lệnh, điều này có thể sẽ ngắn hơn bcgiải pháp (có thể là, ví dụ, `echo ...|bc`).

Liên quan đến tính dài dòng, bclệnh cho phép tùy chọn -qtriệt tiêu đầu ra của " bcchào mừng GNU bình thường " .

Là một nhận xét cuối cùng, hơi biên giới, hãy lưu ý rằng đó bckhông chỉ là một máy tính mà là một ngôn ngữ lập trình đầy đủ (bao gồm các hàm do người dùng xác định, trong khi & cho các vòng lặp, v.v.). Một thực tế khác cho thấy thích các khả năng số học tích hợp cho các phép tính đơn giản như vậy, hơn là một chương trình bên ngoài. Điều đó nói rằng, trích xuất dữ liệu cho (các) số phân vùng đã cho và xử lý các hậu tố "M", "G", như câu hỏi ban đầu dường như yêu cầu, có thể gọi (g)awkthay vì bc.

Nguồn: https://www.gnu.org/software/bc/manual/html_mono/bc.html https://www.gnu.org/software/gawk/manual/html_node/Getting-Started.html


Cảm ơn! Câu trả lời đầu tiên tuyệt vời! +1
Fabby

2
$((...))được gọi Arithmetic Expansion và nó là một phần của POSIX: pubs.opengroup.org/onlinepubs/9699919799/utilities/... Đối với tôi, nhược điểm lớn nhất của tính năng này của một vỏ POSIX là nó chỉ hỗ trợ số nguyên số học :(
pabouk

6

Những gì tôi làm trong zsh là:

$ <<< $(( 236 - 192 ))
44

Trong bash, tôi phải đề cập rõ ràng đến con mèo:

$ cat <<< $(( 236 - 192 ))
44

Nếu tôi muốn kết quả bao gồm các chữ số phân số (hoạt động trong zsh, không phải trong bash), tôi sẽ thêm một điểm cơ số vào một trong các toán hạng

$ <<< $(( 236 / 128 )) 
1
$ <<< $(( 236. / 128 ))
1.84375

7
echo $((236 - 128))hoạt động quá ;-).
Stephen Kitt

Tránh zsh : zsh -c 'print $((12345678901234567890123 + 1))' zsh:1: number truncated after 22 digits: 12345678901234567890123 + 1 -1363962815083169259.
Isaac

@Isaac ít nhất zsh cho bạn biết đó là cắt ngắn; bash chỉ cung cấp cho bạn một câu trả lời không chính xác mà không phàn nàn.
Stephen Kitt

@StephenKitt Vấn đề với zsh phức tạp hơn một đầu ra cho thấy. So sánh: zsh -c 'print $((12345678901234567890123 + 1))'zsh -c 'print $((123456789012345678901 + 1))'. Nó được cắt ở các độ dài khác nhau và tạo ra các kết quả số khác nhau.
Isaac

@StephenKitt Thay vào đó Bash đang làm theo hướng dẫn (và ngôn ngữ C về tràn của một int đã ký). Không phải cá nhân tôi thích nó, nhưng nó được ghi lại như vậy. Hãy thử bash -c 'echo $((1<<63))'và `` bash -c 'echo $ (((1 << 63) -1))' `.
Isaac

6

Cá nhân, tôi thích libqalculate (phiên bản dòng lệnh của Qalculate ).

$ qalc
> 236-192

  236 - 192 = 44

Trong khi giao diện chắc chắn đơn giản, (lib) qalculate là một máy tính mạnh mẽ, đầy đủ chức năng. ví dụ

> fibonacci(133) to hex

  fibonacci(133) = approx. 0x90540BE2616C26F81F876B9

> 100!

  factorial(100) = approx. 9.3326215E157

> sin(pi)

  sin(pi * radian) = 0

Nó cũng thực hiện những việc hữu ích như hoàn thành tab, mở / đóng ngoặc khi cần thiết và in giải thích truy vấn của nó.

> 18-2)/4

  (18 - 2) / 4 = 4

Để thoát, tôi chỉ cần nhấn Ctrl+ d.

Để truy cập thậm chí nhanh hơn, đặt nó vào một cái gì đó như alias ca='qalc'.


Tôi đã đọc TOC của hướng dẫn nhưng không thể tìm thấy bất cứ điều gì về CLI. (+1 trong lúc này)
Fabby 6/11/18

1
Cảm ơn @Fabby. Tôi đã nhầm lẫn, và phần CLI thực sự hơi khác nhau. Tôi đã cập nhật câu trả lời để làm rõ.
Sparhawk

Tôi ước tôi có thể nâng cao bạn hai lần! ;-)
Fabby

4

Python mở trong một tab khác?

Python 3.6.3 (v3.6.3:2c5fed8, Oct  3 2017, 17:26:49) [MSC v.1900 32 bit (Intel)] on 
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> 3+3
6
>>>

Không, không thực sự, nhưng một ý tưởng gọn gàng nào! :-) +1
Fabby

powershell cũng có thể làm điều tương tự
phuclv

1
@phuclv có, nhưng không ai thích PS
Dev

3
@Dev tấn người Unix yêu thích PS
phuclv

2

dc -e '236 192-p'

... tất nhiên, nếu bạn không quen thuộc dcvà bạn yêu cầu nhiều hơn trừ hai số, bạn sẽ dành nhiều thời gian hơn để tìm cách sử dụng dc(và có thể nói chung là RPN ) so với bạn sẽ tiết kiệm bằng các phương pháp quen thuộc hơn.


Vâng, đã có 3 phút nhìn vào Máy tính bàn và biết rằng nó không dành cho tôi: Tôi là TI, không phải là sinh viên HP.
Fabby

2

Nếu bạn đã cài đặt lớp thì bạn có ...

Nếu Groovy được định tuyến chính xác, bạn sẽ có thể sử dụng:

groovy -e "println 1+1"

Điều này có vẻ hơi dư thừa với tất cả các ví dụ khác, nhưng:

  • Groovy là một ngôn ngữ mạnh mẽ
  • có thể là hỗ trợ thư viện tốt nhất hiện có
  • các hàm toán học đơn giản và mạnh mẽ (Giống như toán chính xác tùy ý)
  • sử dụng thiết bị xuất chuẩn có thể chuyển hướng cho đầu ra của nó để nó linh hoạt đáng kinh ngạc (tuyệt vời khi sử dụng bên trong các tệp bó với backticks `` và tương tự).

Nếu bạn chưa cài đặt java thì có lẽ không đáng để cài đặt Groovy & java - đó chỉ là một tùy chọn nếu Groovy đã có sẵn.


Không, không thực sự, nhưng một ý tưởng gọn gàng nào! :-) +1
Fabby

2

Bạn đã thử concalc chưa?

Mô tả: máy tính bàn điều khiển concalc là một máy tính cho bàn điều khiển Linux. Nó chỉ là thuật toán phân tích cú pháp của extcalc được đóng gói trong một chương trình điều khiển đơn giản. Bạn có thể sử dụng nó nếu bạn cần một máy tính trong vỏ của bạn. concalc cũng có thể chạy các tập lệnh được viết bằng ngôn ngữ lập trình giống như C.

$ concalc 1+1
2
$ concalc sqrt2
1.41421356237309505

Cài đặt với:

sudo apt-get install concalc

1
bằng chứng ... Graag gedaan ... :-D
Fabby

2

Trước khi bất kỳ câu trả lời xuất sắc nào khác được đăng, tôi đã kết thúc việc tạo tập lệnh /usr/local/bin/cchứa:

#!/bin/sh
IFS=' '               # to be on the safe side, some shells fail to reset IFS.
if [ "$#" -eq 0 ];  then
    echo "$(basename "$0"): a (very) simple calculator."
    echo "type $(basename "$0") expression to evaluate (uses bc internally)"
fi

printf '%s\n' "$*" | bc -l  # safe for most shells
                            # we may use 'bc -l <<<"$*"` for ksh, bash, zsh

vì vậy: gõ c 1+1năng suất 2! :-)

Lưu ý 1: Tôi đã sử dụng cvì lệnh đó không tồn tại trên bất kỳ hệ thống Unix nào mà tôi có thể tìm thấy. Nếu bạn đã đặt bí danh cho trình biên dịch c của mình, hãy sử dụng bất cứ thứ gì ngắn và bạn không sử dụng.
Lưu ý 2: Nguồn


1
(1) Quyết định sử dụng echo "$*" | bc -lnhư shebang bạn đã sử dụng /bin/shvà tôi không biết nếu bạn có sẵn ksh / bash / zsh. (2) Lưu ý rằng bạn có thể thay đổi thang đo để tính toán là bạn thực hiện `c 'scale = 60; 777/333', chẳng hạn. Hy vọng nó sẽ giúp @Fabby
Isaac

1

Nếu python được cài đặt, bạn có thể thực hiện nhiều thao tác toán học thông qua dòng lệnh. Tôi đã cố gắng cung cấp một số ví dụ dưới đây.

Tôi đã sử dụng python3bạn có thể sử dụng python. Sự khác biệt giữa pythonpython3xảy ra khi hoạt động phân chia (phân đoạn) xảy ra, để tránh sự cố xem bên dưới python vs python3 .

Lưu ý: Tất cả các phiên bản linux mới nhất đi kèm với cả Python 2.7 và Python 3.5 theo mặc định. Trong trường hợp nếu cần phải cài đặt python bấm vào đây .

Thêm, trừ, nhân và chia:

$ python3 <<< "print(12+3)"
15
$ python3 <<< "print(12-3)"
9
$ python3 <<< "print(12*3)"
36
$ python3 <<< "print(12/3)"
4

Modulus -remainder của bộ phận:

$ python3 <<< "print(14%3)"
2

Phân chia tầng:

$ python3 <<< "print(14//3)"
4

Số mũ - x với sức mạnh của y (x ^ y):

$ python3 <<< "print(3**2)"
9

Căn bậc hai (ví dụ: √4 = 2):

$ python3 <<< "print(4**0.5)"
2

Phần khoa học hơn, bạn sẽ yêu cầu thư viện toán học nhập khẩu . Vd

Logarit tự nhiên của x = log (x):

$ python3 <<< "import math; print(math.log(4))"
1.386294361119890e6

Logarit cơ sở 10 của x = log10 (x):

$ python3 <<< "import math; print(math.log10(10))"
1.0

Yếu tố (ví dụ: 3! = 3.2.1 = 6):

$ python3 <<< "import math; print(math.factorial(3))"
6

Trigonometry- sin(x), cos(x), tan(x):

$ python3 <<< "import math; print(math.sin(90))"
0.8939966636005579

Để biết thêm các hàm liên quan đến toán học kiểm tra ở đây .

pythonVs python3:

-Để phân chia: (sử dụng float):

$ python <<< "print(10.0/3)"
3.33333333333

-thay vì

$ python <<< "print(10/3)"
3

Ngoài ra, bạn có thể sử dụng thiết bị đầu cuối trực tiếp:

$ python3
Python 3.6.8 (default, Jan 14 2019, 11:02:34) 
[GCC 8.0.1 20180414 (experimental) [trunk revision 259383]] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 1+3
4
>>> import math
>>> math.log10(4)
0.6020599913279624
>>> math.sqrt(4)
2.0
>>> 

Đó là nó. Chúc mừng mã hóa!


0

Hoặc là bchay qalc.


Để tự động bcluôn luôn làm tròn đến hai chữ số: (chạy với nó -llà khó sử dụng cho công cụ hàng ngày)

Chỉnh sửa của bạn ~/.bashrc:

alias bc="BC_ENV_ARGS=<(echo "scale=2") \bc"

Mở một vỏ mới và chạy bcở đó.


-1

Tạo một lớp lót:

$ c () { echo $(( ${1} )) }

Bây giờ bạn có thể sử dụng toán học số nguyên đơn giản:

$ c 1+1
2

$ c 25*4
100

$ c 25*4-10
90

$ c 20*5/4
25

Điều này đã được thảo luận trong câu trả lời của Isaac .
Stephen Kitt

@StephenKitt Có, tôi nêu lên câu trả lời rất chi tiết của Isaac. Tôi nghĩ rằng một bài tóm tắt tóm tắt một số những gì anh ấy đăng sẽ hữu ích. Việc ${1}sử dụng tham số là duy nhất cho tất cả các câu trả lời.
WinEunuuchs2Unix

2
Tôi khuyến khích bạn xem xét các lý do mà các câu trả lời khác không sử dụng ${1};-)
Stephen Kitt
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.