Trong bash shell đôi khi chúng ta cần so sánh các đối tượng với nhau. trong bài này mình sẽ hướng dẫn một số lệnh giúp các bạn tính toán trong bash shell
Tính toán số nguyên với lệnh expr
$ expr 11 + 123
134
$ expr 134 / 11
12
$ expr 134 - 11
123
$ expr 11 * 123
expr: syntax error <== oops!
$ expr 11 \* 123
1353
$ expr 20 % 3
2
$ expr 11 \> 10
1
$ expr 11 \> 17
0
Lưu ý khi dùng cho phép so sánh hoặc nhân chúng ta cần thêm dấu "\" để không cho các tự * <> thành các ký tự đặc biệt và gây lỗi cho quá trình tính toán. Khi tiến hành so sánh với expr thì chúng ta chỉ nhận được kết quả là 0 hoặc 1 nghĩa là sai hoặc đúng với đúng là 1 còn sai sẽ là 0.
expr chỉ cung cấp cho chúng ta khả năng tính toán căn bản để nâng cao hơn với các phép tính như sin cos trong hình học thì chúng ta dùng awk
Tính toán với lệnh awk. awk mục đích chính là dùng để cắt dòng trong linux tuy nhiên mình phát hiện nó hoàn toàn dùng để tính toán được
$ awk "BEGIN {print (20+5)/2}"
12.5
$ awk "BEGIN {print sqrt(25)}"
5
$ awk "BEGIN {print int(25.2343565465)}"
25
$ awk "BEGIN {print sin(25)}"
-0.132352
$ awk "BEGIN {print cos(25)}"
0.991203
Như vậy với khả năng mở rộng của awk cho chúng ta khả năng tính toán với nhiều dạng phức tạp hơn
một số thông số khi dùng với awk
- int là lấy phần nguyên của một số có dạng thập phân
- sin cos.. là các phép tính hình học
- log (x) - logarit tự nhiên của x (miễn là x dương)
- exp (x) - số mũ của x (e ^ x) hoặc lỗi nếu x nằm ngoài phạm vi
- rand () - một số ngẫu nhiên - luôn nằm trong khoảng từ 0 đến 1
- srand (x) - đặt điểm bắt đầu cho các số ngẫu nhiên
Dưới đây là một ví dụ về tính toán awk và so sánh trả về kết quả no hoặc yes
#!/bin/bash
ans=`awk -vmin=0 -vmax=1 'BEGIN{srand(); print int(min+rand()*(max-min+1))}'`
if [ $ans -eq 0 ]; then
echo "no"
else
echo "yes"
fi
Nếu bạn chỉ cần lấy phần nguyên của một phép tính thập phân thì lệnh echo hoàn toàn làm được
$ echo "$((20/7))"
2
$ echo "$((20+7))"
27
chú ý lệnh echo sẽ không cho chúng ta kết quả thập phân chỉ ra cho chúng ta số nguyên của phép tính ví dụ (20+5)/2
với awk chúng ta có
$ awk "BEGIN {print (20+5)/2}"
12.5
Với echo chúng ta có
$ echo "$(((20+5)/2))"
12
Tùy vào điều kiện và yêu cầu tính toán mà các bạn nên lựa chọn phương pháp cho phù hợp
Trong môi trường linux thường được mặc định python và perl nên chúng ta có thể dùng nó để tính toán
# python -c "print 20+5/2"
22
Tuy python có thể tính toán phức tạp nhưng để làm được điều đó thì bạn phải lập trình python như vậy vượt qua khôn khổ bài hướng dẫn này của mình là tính toán trong bash shell.
Một bài toán nữa là lấy nguyên số lẻ trong một dãy số chúng ta dùng đoạn code sau để lấy nguyên số lẻ từ 1 từ 1 tới 99
for i in {1..99}
do
rem=$(($i % 2))
if [ "$rem" -ne "0" ]; then
echo $i
fi
done
Không có nhận xét nào:
Đăng nhận xét