2010-03-10 42 views
23

Tôi vừa stumbled khi cú pháp bash:

foo=42 
bar=$[foo+1] # evaluates an arithmetic expression 

Khi tôi đã google cho điều này, tôi thấy http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_03_04.html#sect_03_04_05 :

3.4.6. Mở rộng số học

Mở rộng số học cho phép đánh giá biểu thức số học và thay thế kết quả. Định dạng để mở rộng số học là:

$((EXPRESSION)) 

...

Bất cứ nơi nào có thể, người sử dụng Bash nên cố gắng sử dụng cú pháp với dấu ngoặc vuông:

$[ EXPRESSION ] 

Tuy nhiên, điều này sẽ chỉ tính toán kết quả của EXPRESSION và không có thử nghiệm nào ...

Trong trang người đàn ông bash của tôi, tôi chỉ có thể tìm thấy $((EXPRESSION)) hình thức như:

foo=42 
bar=$((foo+1)) # evaluates an arithmetic expression 

Vậy kiểm tra không được thực hiện với $[...] rằng làm với $((...)), hoặc là $[...] chỉ là một phiên bản cũ của $((...))?

+1

Đối với phối cảnh lịch sử, hãy xem http://stackoverflow.com/a/40048865/2908724. – bishop

Trả lời

29

Các manpage cho bash v3.2.48 nói:

[...] Các định dạng để mở rộng số học là:

 $((expression)) 

Các định dạng cũ $ [biểu hiện] bị phản và sẽ bị xóa trong các phiên bản sắp tới của bash.

Vì vậy, $[...] là cú pháp cũ không nên được sử dụng nữa.

+5

Lưu ý rằng văn bản chính xác không có trong [* trang bash man] (http://tiswww.case.edu/php/chet/bash/bash.html), trong * một số trang * bash man (ví dụ: [Debian vá lỗi này] (http://patch-tracker.debian.org/patch/series/view/bash/4.1-3/man-arithmetic.dpatch)). Tính năng này đã không còn được dùng kể từ bash-2.0, nhưng vẫn tồn tại ngày hôm nay (bash-4.2). –

9

@sth là hoàn toàn chính xác. Và trong trường hợp bạn đang tò mò về lý do tại sao một cú pháp chi tiết hơn bây giờ có lợi, hãy kiểm tra email cũ này từ danh sách gửi thư.

http://lists.gnu.org/archive/html/bug-bash/2012-04/msg00033.html

“Trong đề xuất sớm, một hình thức $ [biểu hiện] đã được sử dụng. Đó là chức năng tương đương với "$ (())" của văn bản hiện tại, nhưng phản đối là cho rằng KornShell 1988 đã triển khai "$ (())" và không có lý do thuyết phục nào để phát minh thêm một cú pháp khác . Hơn nữa, "$ []" cú pháp đã có một sự không tương thích nhỏ liên quan đến các mẫu trong trường hợp báo cáo.”

Tôi không chắc chắn mà tôi thích lý do‘nhưng ai đó đã làm điều này một cách chi tiết hơn,’nhưng có bạn có nó - có lẽ vấn đề tuyên bố trường hợp hấp dẫn hơn tôi tưởng tượng từ đề cập tối nghĩa này?

Các vấn đề liên quan