Câu trả lời:
Có, bạn có thể sử dụng Mở rộng số học tích hợp của bash$(( ))
để thực hiện một số phép toán đơn giản
$ echo "$((5 * 5))"
25
Kiểm tra phần Số học Shell trong Hướng dẫn tham khảo Bash để biết danh sách đầy đủ các toán tử.
Để hoàn thiện, như đã chỉ ra, nếu bạn cần độ chính xác tùy ý, bc
hoặc dc
sẽ tốt hơn.
Bash hỗ trợ mở rộng số học với $(( expression ))
. Ví dụ:
$ echo $(( 5 * 5 ))
25
Một số tiện ích cung cấp số học, bao gồm bc và expr .
$ echo '5 * 5' | /usr/bin/bc
25
$ /usr/bin/expr 5 \* 5
25
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.
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?
dc
hiế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 man
trang FreeBSD cũ (1993) đề cập đến mặc định là 0, nhưng các man
trang BSD cũ hơn thì không.
echo '4 k 50.5 7 / p' | dc
hoạt động (đầu ra 7.2142
:).
Tôi sử dụng chức năng này sử dụng bc
và 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
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).tr
có thể được sử dụng để làm ánh xạ ký tự cho nhiều ký tự.
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
dc
làm việc với phao. Hãy thửecho '4 k 50 7 / p' | dc
. Đầu ra là7.1428
. Cáck
lệnh đặt chính xác.