หากไม่มี()
ไวยากรณ์จะไม่ชัดเจน
จะต้องมีไวยากรณ์ที่ชัดเจนบางอย่างสำหรับการกำหนดฟังก์ชั่นและหากไม่มีการแก้ไขไวยากรณ์เชลล์อื่น ๆอย่างมีนัยสำคัญมันไม่สามารถเป็นเช่นนี้:
do_something {
# one or more commands go here
}
คุณบอกว่า "ไม่ได้ทำผิดกับไวยากรณ์ปัจจุบัน" แต่มันไม่ได้! ขอให้สังเกตว่าคุณไม่ได้รับชนิดของไวยากรณ์ผิดพลาดใด ๆ เมื่อคุณพยายามที่จะเรียกบรรทัดแรกของที่ คุณได้รับข้อผิดพลาด แต่ไม่ใช่ข้อผิดพลาดเกี่ยวกับไวยากรณ์ บรรทัดที่สองด้วย}
คือข้อผิดพลาดทางไวยากรณ์ แต่บรรทัดแรกไม่ใช่ ให้do_something {
พยายามเรียกใช้คำสั่งที่เรียกdo_something
และส่งผ่าน{
เป็นอาร์กิวเมนต์ไปยังคำสั่งนั้นแทน:
$ do_something {
do_something: command not found
หากมีคำสั่งที่เรียกว่าdo_something
คุณกำลังเรียกใช้ หากมีฟังก์ชั่นที่เรียกว่าdo_something
, คุณเรียกมันว่า เป็นสิ่งสำคัญโดยทั่วไปว่าไวยากรณ์ไม่มีความกำกวม แต่ก็มีความสำคัญโดยเฉพาะอย่างยิ่งว่าเป็นไปได้ที่จะกำหนดฟังก์ชันใหม่โดยไม่ได้ตั้งใจเรียกมันแทน การกำหนดฟังก์ชั่นและการเรียกมันไม่ควรเหมือนกัน
วิธีถือว่าเปลือกและ{
(
ตามที่type {
จะบอกคุณ{
คือคำหลักของเชลล์ [[
นี้จะทำให้มันเหมือน หากใช้ในสถานการณ์ที่อาจเป็นคำสั่งให้{
พกความหมายพิเศษ โดยเฉพาะมันทำการจัดกลุ่มคำสั่ง อย่างไรก็ตามในสถานการณ์อื่น ๆ อาจใช้ unescaped เพื่อแสดง{
อักขระตามตัวอักษร ซึ่งรวมถึงสถานการณ์การส่งผ่านเป็นคำที่สองหรือต่อมาของคำสั่ง
แน่นอนว่า Bash นั้นได้รับการออกแบบมาเพื่อรักษาที่{
แตกต่างไปจากปัจจุบัน อย่างไรก็ตามไวยากรณ์ของมันจะไม่เข้ากันได้กับ POSIX เชลล์อีกต่อไปและ Bash จะไม่ใช่เชลล์สไตล์แบบบอร์นจริงๆและจะไม่สามารถเรียกใช้เชลล์สคริปต์จำนวนมากได้
ในทางตรงกันข้าม(
เป็นตัวบ่งชี้เชลล์ มันได้รับการปฏิบัติเสมอเป็นพิเศษถ้ามันปรากฏในคำสั่งและไม่ได้ยกมา (มี'
'
, "
"
หรือ\
) ดังนั้นจึงไม่มีความกำกวมในไวยากรณ์:
do_something() {
# one or more commands go here
}
นั่นไม่ได้หมายความว่าอย่างอื่น หาก Bash ไม่มีฟังก์ชั่นแสดงว่าเป็นข้อผิดพลาดทางไวยากรณ์เนื่องจากเหตุผลเดียวกันecho foo(bar)
คือข้อผิดพลาดทางไวยากรณ์
ถ้าคุณไม่ชอบจริงๆ()
โน้ตแล้วคุณสามารถใช้คำหลักfunction
และงดมันเป็นsudodus กล่าว โปรดทราบว่านี่ไม่ใช่ส่วนหนึ่งของไวยากรณ์สำหรับการกำหนดฟังก์ชั่นในเชลล์สไตล์บอร์นอื่น ๆ ส่วนใหญ่ - และในบางกรณีมันได้รับการสนับสนุน แต่ฟังก์ชั่นที่กำหนดไว้นั้นมีความหมายต่างกัน - ดังนั้นสคริปต์ที่ใช้ (เหตุผลที่วากยสัมพันธ์นี้ไม่สามารถคลุมเครือได้นั่นfunction
คือตัวมันเองเป็นคีย์เวิร์ดใน Bash ที่บ่งบอกว่าสิ่งใดก็ตามที่ตามมาคือการเริ่มต้นของนิยามฟังก์ชัน)
สุดท้ายโปรดทราบว่าในขณะที่คำจำกัดความของฟังก์ชั่นส่วนใหญ่ใช้{
ในทางปฏิบัติคำสั่งผสมใด ๆ ที่ได้รับอนุญาต หากคุณมีฟังก์ชั่นที่มีร่างกายที่คุณอยากที่จะทำงานใน subshell คุณสามารถใช้มากกว่า(
)
{
}