ทั้งนี้ขึ้นอยู่กับสถานการณ์ที่แน่นอนสิ่งนี้อาจไม่ระบุอย่างชัดเจน (ดังนั้นการนำไปปฏิบัติอาจทำได้ตามที่ต้องการ) หรือจำเป็นต้องเกิดขึ้นตามที่คุณสังเกตเห็น ในสถานการณ์ที่แน่นอนของคุณecho ab$, POSIX เอกสารส่งออก "AB $" ที่คุณสังเกตเห็นและมันไม่ได้เป็นที่ไม่ได้ระบุ บทสรุปอย่างรวดเร็วของทุกกรณีที่แตกต่างกันคือในตอนท้าย
มีองค์ประกอบอยู่สองประการด้วยกันคือการทำให้เป็นคำแรกจากนั้นจึงตีความคำเหล่านั้น
Tokenisation
POSIX tokenisation ต้องว่า$ที่ไม่ได้เป็นจุดเริ่มต้นของที่ถูกต้องการขยายตัวพารามิเตอร์ , แทนคำสั่งหรือเปลี่ยนตัวคณิตศาสตร์ที่จะได้รับการพิจารณาเป็นส่วนหนึ่งที่แท้จริงของWORDความเป็นโทเค็นการสร้าง เพราะนี่คือกฎที่ 5 ( "ถ้าตัวละครปัจจุบันเป็น unquoted $หรือ`เปลือกจะระบุจุดเริ่มต้นของผู้สมัครใด ๆ สำหรับการขยายตัวพารามิเตอร์แทนคำสั่งหรือการขยายตัวทางคณิตศาสตร์จากเบื้องต้นลำดับตัวอักษร unquoted ของพวกเขา$หรือ${, $(หรือ`และ$((ตามลำดับ" ) ใช้ไม่ได้เนื่องจากไม่มีส่วนขยายใด ๆ การขยายพารามิเตอร์ต้องการชื่อที่ถูกต้องเพื่อปรากฏที่นั่นและชื่อที่ว่างเปล่าไม่ถูกต้อง
เนื่องจากกฎนี้ใช้ไม่ได้เราจึงดำเนินการต่อไปจนกว่าเราจะพบกฎที่ใช้ ผู้สมัครทั้งสองคือ # 8 ("หากอักขระก่อนหน้าเป็นส่วนหนึ่งของคำอักขระปัจจุบันจะถูกต่อท้ายคำนั้น") และ # 10 ("อักขระปัจจุบันถูกใช้เป็นจุดเริ่มต้นของคำใหม่") ซึ่งใช้กับecho a$และecho $ตามลำดับ
นอกจากนี้ยังมีกรณีที่สามของแบบฟอร์มecho a$+bที่ตกผ่านรอยแตกเดียวกันเนื่องจาก+ไม่ใช่ชื่อของพารามิเตอร์พิเศษ อันนี้เราจะกลับไปทีหลังเพราะมันก่อให้เกิดส่วนต่าง ๆ ของกฎ
สเปคจึงต้อง$ให้ถือว่าเป็นส่วนหนึ่งของคำ syntactically และจากนั้นจะสามารถดำเนินการต่อไปในภายหลัง
การขยายคำ
หลังจากอินพุตถูกวิเคราะห์คำด้วยวิธีนี้ด้วยคำที่$รวมอยู่ในคำการขยายคำจะถูกนำไปใช้กับแต่ละคำที่อ่านแล้ว แต่ละคำจะถูกประมวลผลแยกกัน
มีการระบุว่า :
หากไม่มีเครื่องหมายอัญประกาศ '$' ตามด้วยอักขระที่ไม่ใช่ตัวใดตัวหนึ่งต่อไปนี้:
- อักขระตัวเลข
- ชื่อของหนึ่งในพารามิเตอร์พิเศษ (ดูพารามิเตอร์พิเศษ )
- อักขระตัวแรกที่ถูกต้องของชื่อตัวแปร
- A
<left-curly-bracket>('{')
-
<left-parenthesis>
ผลลัพธ์ไม่ได้ระบุ
"ไม่ระบุ" เป็นคำเฉพาะที่นี่หมายความว่า
- เชลล์ที่สอดคล้องกันสามารถเลือกพฤติกรรมใด ๆ ในกรณีนี้
- แอปพลิเคชันที่สอดคล้องไม่สามารถพึ่งพาพฤติกรรมใด ๆ
ในตัวอย่างของecho ab$การ$ ไม่ปฏิบัติตามโดยการใด ๆของตัวละครเพื่อให้กฎนี้ใช้ไม่ได้ผลและไม่ได้ระบุไม่ได้เรียก มีเพียงการขยายตัวไม่เข้าฝันโดย$ดังนั้นจึงมีอยู่จริงและพิมพ์ออกมา
ที่มันจะecho a$+bนำไปใช้ในกรณีที่สามของเราจากเบื้องบน ที่นี่$มีผู้ติดตาม+ซึ่งเป็นตัวเลขที่ไม่พารามิเตอร์พิเศษ ( @, *, #, ?, -, $, !หรือ0) เริ่มต้นของตัวแปรชื่อ (ขีดหรือตัวอักษรจากชุดตัวอักษรแบบพกพา ) หรือหนึ่งในวงเล็บ ในกรณีนี้พฤติกรรมที่ไม่ระบุรายละเอียด: เปลือกสอดคล้องจะได้รับอนุญาตในการคิดค้นพารามิเตอร์พิเศษที่เรียกว่า+จะขยายและแอปพลิเคสอดคล้องไม่ควรคิดว่าเปลือกไม่ เชลล์สามารถทำอะไรก็ได้ที่มันชอบเช่นกันรวมถึงการรายงานข้อผิดพลาด
ตัวอย่างเช่น zsh รวมถึงในโหมด POSIX ตีความ$+bว่า "เป็นbชุดตัวแปร"และทดแทน 1 หรือ 0 ทั้งที่แทน ในทำนองเดียวกันมันมีส่วนขยายและ~ =นี่คือพฤติกรรมที่สอดคล้อง
echo "a$ b"สถานที่แห่งนี้จะเกิดขึ้นก็คือ อีกครั้งเชลล์ได้รับอนุญาตให้ทำตามที่ต้องการและคุณในฐานะผู้เขียนสคริปต์ควรหลีกเลี่ยง$ถ้าคุณต้องการผลลัพธ์ที่แท้จริง ถ้าคุณทำไม่ได้มันอาจใช้งานได้ แต่คุณไม่สามารถไว้ใจได้ นี่คือตัวอักษรที่แน่นอนของข้อกำหนด แต่ฉันไม่คิดว่าการเรียงลำดับแบบนี้มีจุดมุ่งหมายหรือพิจารณา
สรุป
echo ab$: เอาต์พุตตัวอักษรที่ระบุอย่างเต็มที่
echo a$ b: เอาต์พุตตัวอักษรที่ระบุอย่างเต็มที่
echo a$ b$: เอาต์พุตตัวอักษรที่ระบุอย่างเต็มที่
echo a$b: การขยายตัวของพารามิเตอร์bที่ระบุไว้อย่างสมบูรณ์
echo a$-b: การขยายตัวของพารามิเตอร์พิเศษ-ที่ระบุไว้อย่างเต็มที่
echo a$+b: พฤติกรรมที่ไม่ระบุ
echo "a$ b": พฤติกรรมที่ไม่ระบุ
สำหรับ$ท้ายคำคุณได้รับอนุญาตให้พึ่งพาพฤติกรรมและต้องได้รับการปฏิบัติอย่างแท้จริงและส่งต่อไปยังechoคำสั่งซึ่งเป็นส่วนหนึ่งของการโต้แย้ง นั่นคือข้อกำหนดที่สอดคล้องกับเชลล์
$ได้รับความหมายพิเศษหรือไม่ถ้าเป็นตัวอักษรสุดท้ายในคำเดียว" ไม่มีความหมายพิเศษเดียวที่กำหนดให้$; มันจะถูกใช้ในการแนะนำหลาย แต่ที่แตกต่างกันการขยายเช่นการขยายตัวพารามิเตอร์${...}แทนคำสั่งและการแสดงออกทางคณิตศาสตร์$(...)$((...))เชลล์บางตัวแนะนำบริบทเพิ่มเติมเช่นkshชุดย่อยการแทนที่คำสั่งx=${ echo foo; echo bar;}(ซึ่งแตกต่างจากมาตรฐาน$(...)โดยไม่เรียกใช้คำสั่งในเชลล์ย่อย)