มีความแตกต่างใด ๆ ในการเรียกใช้ตัวแปรมีไวยากรณ์${var}
และ$(var)
? ตัวอย่างเช่นตัวแปรจะขยายหรืออะไร?
มีความแตกต่างใด ๆ ในการเรียกใช้ตัวแปรมีไวยากรณ์${var}
และ$(var)
? ตัวอย่างเช่นตัวแปรจะขยายหรืออะไร?
คำตอบ:
ไม่มีความแตกต่าง - หมายความว่าเหมือนกันทุกประการ (ใน GNU Make และใน POSIX make)
ฉันคิดว่า$(round brackets)
มันดูเป็นระเบียบกว่า แต่นั่นเป็นเพียงความชอบส่วนตัว
(คำตอบอื่น ๆ ชี้ไปที่ส่วนที่เกี่ยวข้องของเอกสารประกอบ GNU และโปรดทราบว่าคุณไม่ควรผสมไวยากรณ์ภายในนิพจน์เดียว)
deploy: ${DEPS}
ว่าเป็นข้อผิดพลาดทางไวยากรณ์สำหรับฉัน แต่แสดงdeploy: $(DEPS)
ว่าถูกต้องแม้ว่าการสะกดทั้งสองจะมีผลเหมือนกันเมื่อเรียกเข้าmake
มา
พื้นฐานของตัวแปรอ้างอิงส่วนจากGNU make
รัฐเอกสารไม่มีความแตกต่าง :
ในการแทนที่ค่าของตัวแปรให้เขียนเครื่องหมายดอลลาร์ตามด้วยชื่อของตัวแปรในวงเล็บหรือวงเล็บปีกกา: อย่างใดอย่างหนึ่ง
$(foo)
หรือ${foo}
เป็นการอ้างอิงที่ถูกต้องสำหรับตัวแปร foo
ตามที่ได้ระบุไว้อย่างถูกต้องแล้วไม่มีความแตกต่างแต่ระวังอย่าผสมตัวคั่นทั้งสองแบบเข้าด้วยกันเพราะอาจทำให้เกิดข้อผิดพลาดที่คลุมเครือได้เช่นเดียวกับตัวอย่าง GNU ที่ไม่เป็นธรรม
จากGNU ทำให้คู่มือเกี่ยวกับ Function Call Syntax (เน้นของฉัน):
[…] หากอาร์กิวเมนต์มีการเรียกใช้ฟังก์ชันอื่น ๆ หรือการอ้างอิงตัวแปรก็เป็นการดีที่สุดที่จะใช้ตัวคั่นชนิดเดียวกันสำหรับการอ้างอิงทั้งหมด เขียนไม่ได้
$(subst a,b,$(x))
$(subst a,b,${x})
นี้เป็นเพราะมันเป็นที่ชัดเจนและเพราะเพียงหนึ่งชนิดของตัวคั่นจะถูกจับคู่เพื่อหาจุดสิ้นสุดของการอ้างอิง
จริงๆแล้วดูเหมือนว่าจะแตกต่างกันพอสมควร:
, = ,
list = a,b,c
$(info $(subst $(,),-,$(list))_EOL)
$(info $(subst ${,},-,$(list))_EOL)
เอาต์พุต
a-b-c_EOL
md/init-profile.md:4: *** unterminated variable reference. Stop.
แต่จนถึงตอนนี้ฉันพบความแตกต่างนี้ก็ต่อเมื่อชื่อตัวแปรใน $ {... } มีเครื่องหมายจุลภาค ตอนแรกฉันคิดว่า $ {... } กำลังขยายเครื่องหมายจุลภาคไม่ได้เป็นส่วนหนึ่งของค่า แต่ปรากฎว่าฉันไม่สามารถแฮ็คได้ด้วยวิธีนี้ ฉันยังไม่เข้าใจเรื่องนี้ ... หากใครมีคำอธิบายฉันยินดีที่จะทราบ!
สไตล์ $ {} ช่วยให้คุณสามารถทดสอบกฎการสร้างในเชลล์ได้หากคุณมีตัวแปรสภาพแวดล้อมที่กำหนดไว้เนื่องจากมันเข้ากันได้กับ bash
จะสร้างความแตกต่างหากนิพจน์มีวงเล็บที่ไม่สมดุล:
${info ${subst ),(,:-)}}
$(info $(subst ),(,:-)))
->
:-(
*** insufficient number of arguments (1) to function 'subst'. Stop.
สำหรับการอ้างอิงตัวแปรสิ่งนี้สร้างความแตกต่างสำหรับฟังก์ชันหรือสำหรับชื่อตัวแปรที่มีวงเล็บ (คิดไม่ดี)
$()
in make เพื่อหลีกเลี่ยงไม่ให้ตัวเองสับสน (มากกว่าที่มีอยู่แล้ว) ระหว่างตัวแปร make และ shell เอกสารยี่ห้อ GNU ในการอ้างอิงตัวแปร