Một vài lệnh liên quan đến số học, Dash, shell POSIX, sh, Tăng


17

Khi tăng / giảm trước một biến, trong POSIX Shell, sự khác biệt giữa hai ví dụ này là gì. Chúng có vẻ như sẽ có hậu quả tương tự, nhưng liệu chúng có được sử dụng khác nhau không? Khi nào bạn thích cái này hơn cái kia?

X=$((X+1))

: $((X=X+1))

Câu trả lời:


18

Trong ví dụ đầu tiên của bạn, $((X+1))đánh giá biểu thức X + 1 và mở rộng đến kết quả, sau đó được gán cho biến.

Trong ví dụ thứ hai, $((X=X+1))tăng Xtheo một ( $((X++))cũng hợp lệ và ngắn hơn, nhưng không nhất thiết phải được hỗ trợ bởi shell), sau đó mở rộng sang giá trị mới $X, là đối số đầu tiên cho lệnh null , :. Lệnh null bỏ qua các đối số của nó và kết quả bị loại bỏ (với các tác dụng phụ).

Cá nhân tôi thích hình thức đầu tiên vì ba lý do (tương đối chủ quan):

  • Lệnh null không rõ ràng và bị hiểu sai, như được chỉ ra bởi nó thường là chủ đề của các câu hỏi nhầm lẫn ở đây.
  • Hình thức đầu tiên có vẻ tự nhiên hơn về mặt ngữ pháp tổng thể, và thậm chí giống với phong cách đánh giá cũ một chút.
  • Các hình thức đầu tiên rõ ràng hơn và súc tích hơn và không liên quan đến một lệnh.

Bạn sẽ phải sử dụng phiên bản đầu tiên nếu bạn sửa đổi môi trường chỉ bằng một lệnh như

X=$((X+1)) /usr/local/bin/something

Bạn sẽ phải sử dụng biểu mẫu thứ hai để thêm đánh giá trực tiếp vào các đối số:

ls -la "file-$((X++))"   # or ...
ls -la "file-$((X=X+1))" # for better compatibility

Điều này có tác dụng phụ mong muốn, lưu một dòng và khá rõ ràng.

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.