Có sự khác biệt nào trong việc gọi các biến với cú pháp ${var}
và $(var)
? Ví dụ, theo cách biến sẽ được mở rộng hoặc bất cứ điều gì?
Có sự khác biệt nào trong việc gọi các biến với cú pháp ${var}
và $(var)
? Ví dụ, theo cách biến sẽ được mở rộng hoặc bất cứ điều gì?
Câu trả lời:
Không có sự khác biệt - chúng có nghĩa hoàn toàn giống nhau (trong GNU Make và trong POSIX make).
Tôi nghĩ rằng nó $(round brackets)
trông gọn gàng hơn, nhưng đó chỉ là sở thích cá nhân.
(Các câu trả lời khác chỉ đến các phần có liên quan của tài liệu GNU Make và lưu ý rằng bạn không nên kết hợp các cú pháp trong một biểu thức duy nhất)
deploy: ${DEPS}
là lỗi cú pháp đối với tôi, nhưng được hiển thị deploy: $(DEPS)
là đúng, mặc dù cả hai cách viết đều có cùng tác dụng khi được gọi vào make
.
Các khái niệm cơ bản của Tài liệu tham khảo Variable phần từ GNU make
trạng thái tài liệu có sự khác biệt :
Để thay thế giá trị của một biến, viết một dấu đô la theo sau là tên của biến trong dấu ngoặc đơn hoặc dấu ngoặc: một trong hai
$(foo)
hoặc${foo}
là một tham chiếu hợp lệ vào biến foo.
Như đã chỉ ra một cách chính xác, không có sự khác biệt nhưng hãy thận trọng để không trộn lẫn hai loại dấu phân cách vì nó có thể dẫn đến các lỗi khó hiểu như unomadh GNU làm ví dụ.
Từ GNU, hãy tạo sổ tay hướng dẫn về Cú pháp gọi hàm (mỏ nhấn mạnh):
[…] Nếu bản thân các đối số chứa các lệnh gọi hàm khác hoặc các tham chiếu biến, tốt nhất là sử dụng cùng một loại dấu phân cách cho tất cả các tham chiếu; viết
$(subst a,b,$(x))
, không phải$(subst a,b,${x})
. Điều này là do nó rõ ràng hơn và bởi vì chỉ có một loại dấu phân cách được khớp để tìm phần cuối của tham chiếu .
Trên thực tế, nó có vẻ khá khác nhau:
, = ,
list = a,b,c
$(info $(subst $(,),-,$(list))_EOL)
$(info $(subst ${,},-,$(list))_EOL)
đầu ra
a-b-c_EOL
md/init-profile.md:4: *** unterminated variable reference. Stop.
Nhưng cho đến nay tôi chỉ tìm thấy sự khác biệt này khi tên biến thành $ {...} có chứa dấu phẩy. Đầu tiên tôi nghĩ rằng $ {...} đang mở rộng dấu phẩy không phải là một phần của giá trị, nhưng hóa ra tôi không thể hack nó theo cách này. Tôi vẫn không hiểu điều này ... Nếu ai đó có lời giải thích, tôi rất vui được biết!
Kiểu $ {} cho phép bạn kiểm tra các quy tắc tạo trong shell, nếu bạn đã đặt các biến môi trường tương ứng, vì biến đó tương thích với bash.
Nó tạo ra sự khác biệt nếu biểu thức chứa các dấu ngoặc vuông không cân bằng:
${info ${subst ),(,:-)}}
$(info $(subst ),(,:-)))
->
:-(
*** insufficient number of arguments (1) to function 'subst'. Stop.
Đối với các tham chiếu biến, điều này tạo ra sự khác biệt cho các hàm hoặc cho các tên biến có chứa dấu ngoặc (ý tưởng tồi)
$()
make in để tránh tự gây ra sự nhầm lẫn (nhiều hơn đã tồn tại) giữa biến make và shell. GNU Tạo tài liệu về các tham chiếu biến .