Sözdizimi değişkenleri çağrılırken herhangi bir fark var mı ${var}
ve $(var)
? Örneğin, değişkenin genişletilme biçiminde veya herhangi bir şey?
Sözdizimi değişkenleri çağrılırken herhangi bir fark var mı ${var}
ve $(var)
? Örneğin, değişkenin genişletilme biçiminde veya herhangi bir şey?
Yanıtlar:
Fark yok - bunlar tamamen aynı anlama geliyor (GNU Make ve POSIX make'de).
Sanırım bu $(round brackets)
daha düzenli görünüyor, ama bu sadece kişisel tercih.
(Diğer yanıtlar, GNU Make belgelerinin ilgili bölümlerine işaret eder ve sözdizimlerini tek bir ifadede karıştırmamanız gerektiğini unutmayın)
deploy: ${DEPS}
benim için bir sözdizimi hatası olarak vurgulandı , ancak deploy: $(DEPS)
her iki yazımın da çağrıldığında aynı etkiye sahip olmasına rağmen doğru olduğunu gösterdi make
.
Değişken Kaynaklar Temelleri bölümünden gelen GNU make
dokümantasyon devlet farklılık :
Bir değişkenin değeri yerine için parantez olup içinde değişkenin adını ve ardından dolar işareti yazın: Ya
$(foo)
ya${foo}
geçerli bir referanstır değişken foo için.
Zaten doğru bir şekilde belirtildiği gibi, bir fark yoktur, ancak iki tür sınırlayıcıyı karıştırmamaya dikkat edin çünkü bu, unomadh GNU'nun örnek yaptığı gibi şifreli hatalara yol açabilir .
Gönderen Function Çağrı sözdizimi üzerine GNU yapmak kılavuzuna (vurgu benim):
[…] Argümanların kendileri başka işlev çağrıları veya değişken referansları içeriyorsa, tüm referanslar için aynı tür sınırlayıcıları kullanmak en akıllıca olacaktır; yaz
$(subst a,b,$(x))
, değil$(subst a,b,${x})
. Bunun nedeni, daha net olması ve referansın sonunu bulmak için yalnızca bir tür sınırlayıcının eşleştirilmesidir .
Aslında oldukça farklı görünüyor:
, = ,
list = a,b,c
$(info $(subst $(,),-,$(list))_EOL)
$(info $(subst ${,},-,$(list))_EOL)
çıktılar
a-b-c_EOL
md/init-profile.md:4: *** unterminated variable reference. Stop.
Ama şimdiye kadar bu farkı sadece $ {...} değişkeninin adı virgül içerdiğinde buldum. İlk önce $ {...} değerinin bir parçası olarak virgül genişlettiğini düşünmüştüm, ama bu şekilde kesemeyeceğim ortaya çıktı. Hala bunu anlamıyorum ... Birinin bir açıklaması olsaydı, bilmek isterim!
$ {} Stili, bash ile uyumlu olduğundan, karşılık gelen ortam değişkenlerine sahipseniz, kabukta yapma kurallarını test etmenizi sağlar.
İfadenin dengesiz parantez içermesi bir fark yaratır:
${info ${subst ),(,:-)}}
$(info $(subst ),(,:-)))
->
:-(
*** insufficient number of arguments (1) to function 'subst'. Stop.
Değişken referanslar için bu, işlevler için veya parantez içeren değişken adları için bir fark yaratır (kötü fikir)
$()
Make ve shell değişkenleri arasında kendimi karıştırmaktan (zaten mevcut olandan daha fazla) kaçınmak için in make'i kullanıyorum . GNU Değişken başvurularla ilgili belgeler oluşturun .