Nhân trên thiết bị đầu cuối dòng lệnh


115

Tôi đang sử dụng một thiết bị đầu cuối nối tiếp để cung cấp đầu vào cho thí nghiệm trong phòng thí nghiệm của chúng tôi. Tôi thấy rằng sử dụng

$ echo "5X5"

chỉ trả về một chuỗi "5X5". Có một lệnh để thực hiện một hoạt động nhân?

Câu trả lời:



45

Đối với toán học nâng cao và chính xác hơn, hãy xem xét sử dụng bc (1).

echo "3 * 2.19" | bc -l 
6.57

19

Phương pháp nội bộ

Bash hỗ trợ mở rộng số học với $(( expression )). Ví dụ:

$ echo $(( 5 * 5 ))
25

Phương pháp bên ngoài

Một số tiện ích cung cấp số học, bao gồm bcexpr .

$ echo '5 * 5' | /usr/bin/bc
25

$ /usr/bin/expr 5 \* 5
25

15

Giải pháp cổ điển là:

 expr 5 \* 5

Một lựa chọn tốt khác là:

 echo 5 5\*p | dc

Cả hai giải pháp này sẽ chỉ hoạt động với toán hạng nguyên.


1
dclàm việc với phao. Hãy thử echo '4 k 50 7 / p' | dc. Đầu ra là 7.1428. Các klệnh đặt chính xác.
Tạm dừng cho đến khi có thông báo mới.

@Dennis Trong hai triển khai khác nhau của dc, tôi thấy các hoạt động float hoạt động mà không cần gán qua k. Tôi chắc chắn nhớ độ chính xác mặc định là 0 (cắt ngắn thành số nguyên). Có phải tôi đang nhớ sai, hay đơn giản là những triển khai mới hơn đã thay đổi hành vi?
William Pursell

Tôi chỉ sử dụng dchiếm khi trong nhiều năm qua vì tôi đại số hơn và ít RPN hơn nên tôi không nhớ. Trên hệ thống GNU mà tôi đang sử dụng, mặc định là 0. Một mantrang FreeBSD cũ (1993) đề cập đến mặc định là 0, nhưng các mantrang BSD cũ hơn thì không.
Tạm dừng cho đến khi có thông báo mới.

Nhân tiện (đối với những người đọc trong tương lai), ví dụ của tôi đã chỉ ra các toán hạng không nguyên thay vì chỉ một kết quả không nguyên để phản đối chính xác khẳng định đó. Không bao giờ sợ hãi, echo '4 k 50.5 7 / p' | dchoạt động (đầu ra 7.2142:).
Tạm dừng cho đến khi có thông báo mới.

8

Một hàm shell đơn giản (không cần sed) nên thực hiện thủ thuật diễn giải '5X5'

$ function calc { bc -l <<< ${@//[xX]/*}; };
$ calc 5X5
25
$ calc 5x5
25
$ calc '5*5'
25

6

Tôi sử dụng chức năng này sử dụng bcvà do đó hỗ trợ tính toán dấu phẩy động:

c () { 
    local a
    (( $# > 0 )) && a="$@" || read -r -p "calc: " a
    bc -l <<< "$a"
}

Thí dụ:

$ c '5*5'
25
$ c 5/5
1.00000000000000000000
$ c 3.4/7.9
.43037974683544303797

Mở rộng số học của Bash không hỗ trợ float (nhưng Korn shell và zsh thì).

Thí dụ:

$ ksh -c 'echo "$((3.0 / 4))"'
0.75

4

Tôi có một kịch bản đơn giản tôi sử dụng cho việc này:

me@mycomputer:~$ cat /usr/local/bin/c

#!/bin/sh

echo "$*" | sed 's/x/\*/g' | bc -l

Nó thay đổi xđến *từ *là một nhân vật đặc biệt trong vỏ. Sử dụng nó như sau:

  • c 5x5
  • c 5-4.2 + 1
  • c '(5 + 5) * 30' (bạn vẫn phải sử dụng dấu ngoặc kép nếu biểu thức có chứa bất kỳ dấu ngoặc đơn nào).

Tôi thích ý tưởng của bạn để sử dụng "x" để nhân. Bạn có thể sử dụng dấu ngoặc vuông tương tự thay cho dấu ngoặc đơn để tránh phải trích dẫn. trcó thể được sử dụng để làm ánh xạ ký tự cho nhiều ký tự.
Tạm dừng cho đến khi có thông báo mới.

3

Nếu bạn thích python và có một tùy chọn để cài đặt một gói, bạn có thể sử dụng tiện ích này mà tôi đã thực hiện.

# install pythonp
python -m pip install pythonp

pythonp "5*5"
25

pythonp "1 / (1+math.exp(0.5))"
0.3775406687981454

# define a custom function and pass it to another higher-order function
pythonp "n=10;functools.reduce(lambda x,y:x*y, range(1,n+1))"     
3628800
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.