ทั้งนี้ขึ้นอยู่กับสถานการณ์ที่แน่นอนสิ่งนี้อาจไม่ระบุอย่างชัดเจน (ดังนั้นการนำไปปฏิบัติอาจทำได้ตามที่ต้องการ) หรือจำเป็นต้องเกิดขึ้นตามที่คุณสังเกตเห็น ในสถานการณ์ที่แน่นอนของคุณ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;}
(ซึ่งแตกต่างจากมาตรฐาน$(...)
โดยไม่เรียกใช้คำสั่งในเชลล์ย่อย)