นั่นเริ่มต้นเป็นแฮ็คในเชลล์เป้าหมาย ในเชลล์เป้าหมายการแยกคำ IFS เสร็จแล้ว (หลังจาก tokenisation) กับทุกคำในบริบทรายการ (อาร์กิวเมนต์บรรทัดคำสั่งหรือคำที่for
ลูปวนบน) ถ้าคุณมี:
IFS=i var=file2.txt
edit file.txt $var
ที่บรรทัดที่สองจะ tokenised ใน 3 คำ$var
จะขยายและแยก + glob จะทำในทุกสามคำดังนั้นคุณจะสิ้นสุดการทำงานed
กับt
, f
, le.txt
, f
, le2.txt
เป็นข้อโต้แย้ง
การอ้างถึงบางส่วนของสิ่งนั้นจะป้องกัน + + glob แยก เชลล์เป้าหมายในขั้นต้นจำได้ว่าอักขระตัวใดที่อ้างถึงโดยตั้งค่าบิตที่ 8 ไว้ภายใน (ซึ่งเปลี่ยนในภายหลังเมื่อ Unix กลายเป็น 8 บิตที่สะอาด
ทั้งสอง$*
และ$@
เป็นการต่อกันของพารามิเตอร์ตำแหน่งกับช่องว่างระหว่าง แต่มีการประมวลผลพิเศษ$@
เมื่ออยู่ในเครื่องหมายคำพูดคู่ หาก$1
มีfoo bar
และ$2
มีอยู่baz
, "$@"
จะขยายไปยัง:
foo bar baz
^^^^^^^ ^^^
(ด้วย^
s ด้านบนแสดงว่าอักขระตัวใดมีชุดบิตที่ 8) โดยที่ช่องว่างแรกถูกยกมา (มีชุดบิตที่ 8) แต่ไม่ใช่ช่องว่างที่สอง (อันที่เพิ่มเข้ามาระหว่างคำ)
และมันคือการแยก IFS ที่ดูแลการแยกอาร์กิวเมนต์ (สมมติว่าอักขระช่องว่างอยู่ใน$IFS
ตามที่เป็นค่าเริ่มต้น) นั่นคล้ายกับวิธีการ$*
ขยายในรุ่นก่อนหน้าของเปลือก Mashey (ตัวเองขึ้นอยู่กับเปลือก Thomson ในขณะที่เชลล์เป้าหมายถูกเขียนขึ้นจากรอยขีดข่วน)
ที่อธิบายว่าทำไมในบอร์นเปลือกแรก"$@"
จะขยายตัวเป็นสตริงว่างแทนอะไรเลยเมื่อรายการของพารามิเตอร์ตำแหน่งว่างเปล่า (คุณต้องทำงานไปรอบ ๆ ด้วย${1+"$@"}
) ทำไมมันไม่ได้เก็บพารามิเตอร์ตำแหน่งที่ว่างเปล่าและทำไม"$@"
didn ไม่ทำงานเมื่อ$IFS
ไม่มีอักขระเว้นวรรค
ความตั้งใจที่จะสามารถส่งผ่านรายการของอาร์กิวเมนต์คำต่อคำไปยังคำสั่งอื่น แต่ไม่ได้ทำงานอย่างถูกต้องสำหรับรายการที่ว่างเปล่าสำหรับองค์ประกอบที่ว่างเปล่าหรือเมื่อ$IFS
ไม่ได้มีช่องว่าง (สองประเด็นแรกถูกแก้ไขในรุ่นต่อมาในที่สุด )
Korn เชลล์ (ซึ่งอิงกับ POSIX spec) เปลี่ยนพฤติกรรมดังกล่าวในสองสามวิธี:
- การแยก IFS ทำได้เฉพาะกับผลลัพธ์ของการขยายที่ไม่ได้ยกมา (ไม่ใช่คำที่เป็นตัวอักษรเช่น
edit
หรือfile.txt
ในตัวอย่างด้านบน)
$*
และ$@
ถูกรวมเข้ากับอักขระตัวแรกของ$IFS
หรือช่องว่างเมื่อ$IFS
ว่างเปล่ายกเว้นเครื่องหมาย"$@"
อัญประกาศตัวเชื่อมนั้นไม่ถูกยกมาเหมือนในเชลล์เป้าหมายและสำหรับการอ้างอิง"$*"
เมื่อIFS
ว่างเปล่าพารามิเตอร์ตำแหน่งจะถูกต่อท้ายโดยไม่มีตัวคั่น
- มันเพิ่มการสนับสนุนสำหรับอาร์เรย์และ
${array[@]}
${array[*]}
เตือนความทรงจำของ Bourne $*
และ$@
แต่เริ่มต้นที่ดัชนี 0 แทนที่จะเป็น 1 และกระจัดกระจาย (เช่นเชื่อมโยงอาร์เรย์) ซึ่งหมายความว่า$@
ไม่สามารถถือว่าเป็นอาร์เรย์ ksh จริงๆ (เปรียบเทียบกับcsh
/ rc
/ zsh
/ fish
/ yash
ที่ไหน$argv
/ $*
เป็นปกติ อาร์เรย์)
- องค์ประกอบที่ว่างเปล่าจะถูกเก็บรักษาไว้
"$@"
เมื่อ$#
เป็น 0 ตอนนี้ขยายเป็นไม่มีอะไรแทนสตริงว่าง"$@"
ทำงานเมื่อ$IFS
ไม่มีช่องว่างยกเว้นเมื่อIFS
ว่างเปล่า unquote ที่$*
ไม่มี wildcard จะขยายเป็นหนึ่งอาร์กิวเมนต์ (โดยที่พารามิเตอร์ตำแหน่งถูกรวมเข้ากับช่องว่าง) เมื่อ$IFS
ว่างเปล่า
ksh93 แก้ไขปัญหาบางอย่างที่เหลืออยู่ด้านบน ใน ksh93, $*
และ$@
ขยายไปยังรายการของพารามิเตอร์ตำแหน่งที่แยกออกจากกันโดยไม่คำนึงถึงความคุ้มค่าของ$IFS
แล้วแยกเพิ่มเติม + globbed + รั้งขยายตัวในบริบทรายการ$*
ร่วมกับครั้งแรกไบต์ (ไม่ใช่ตัวอักษร) ของ$IFS
, "$@"
ในรายการบริบทขยายไปยังรายการ $IFS
ของพารามิเตอร์ตำแหน่งโดยไม่คำนึงถึงความคุ้มค่าของ ในบริบทที่ไม่ใช่รายการเหมือนในvar=$@
, จะเข้าร่วมกับพื้นที่โดยไม่คำนึงถึงความคุ้มค่าของ$@
$IFS
bash
อาร์เรย์ของถูกออกแบบมาหลังจาก ksh ความแตกต่างคือ:
- ไม่มีการขยายรั้งเมื่อการขยายที่ไม่ได้กล่าวถึง
- อักขระตัวแรกของ
$IFS
แทนไบต์
- ความแตกต่างของมุมกรณีบางอย่างเช่นการขยายตัวของ
$*
เมื่อไม่อ้างถึงในบริบทที่ไม่ใช่รายการเมื่อ$IFS
ว่างเปล่า
ในขณะที่ข้อมูลจำเพาะ POSIX เคยเป็นค่อนข้างคลุมเครือตอนนี้มันมากหรือน้อยระบุพฤติกรรมทุบตี
มันแตกต่างจากอาร์เรย์ปกติในksh
หรือbash
ที่:
- ดัชนีเริ่มต้นที่ 1 แทน 0 (ยกเว้น
"${@:0}"
ซึ่งรวมถึง$0
(ไม่ใช่พารามิเตอร์ตำแหน่งและในฟังก์ชั่นให้ชื่อของฟังก์ชั่นหรือไม่ขึ้นอยู่กับเปลือกและวิธีการกำหนดฟังก์ชั่น)
- คุณไม่สามารถกำหนดองค์ประกอบเป็นรายบุคคล
- มันไม่กระจัดกระจายคุณไม่สามารถแยกองค์ประกอบได้ทีละรายการ
shift
สามารถใช้ได้.
ในzsh
หรือyash
ที่อาร์เรย์เป็นอาร์เรย์ปกติ (ไม่กระจัดกระจายดัชนีเริ่มต้นที่หนึ่งเหมือนในเปลือกอื่น ๆ ทั้งหมด แต่ ksh / bash) $*
จะถือว่าเป็นอาร์เรย์ปกติ zsh
มี$argv
เป็นนามแฝงสำหรับมัน (เพื่อความเข้ากันได้กับcsh
) $*
เหมือนกับ$argv
หรือ${argv[*]}
(อาร์กิวเมนต์เข้าร่วมกับอักขระตัวแรกของ$IFS
แต่ยังแยกออกในบริบทรายการ) "$@"
ชอบ"${argv[@]}"
หรือ"${*[@]}"}
ผ่านกระบวนการพิเศษในสไตล์กร