ครั้งแรกฉันคิดว่าการใช้lsเป็นเพียงตัวอย่าง คุณไม่สามารถแยกวิเคราะห์เอาต์พุตของlsในเชลล์ใด ๆ เนื่องจากไม่ชัดเจน อ่านทำไมคุณไม่ควรวิเคราะห์ผลลัพธ์ของ ls (1)หากนี่เป็นข่าวสำหรับคุณ ในเปลือกใด ๆ ที่จะได้รับรายชื่อของไฟล์, files=(*)การใช้สัญลักษณ์เช่น
ใน zsh เช่นเดียวกับเชลล์อื่น ๆ ผลลัพธ์ของการทดแทนคำสั่งแบ่งออกเป็นคำที่อักขระช่องว่าง (แม่นยำยิ่งขึ้นตามค่าของIFS) (ต่างจากเชลล์อื่น ๆ , ผลลัพธ์ของการทดแทนคำสั่งไม่ขึ้นอยู่กับการกลมใน zsh) ดังนั้นหากเอาต์พุตของlsคำสั่งคือ
hello world
wibble
แล้วfiles=($(ls))กำหนดfilesอาร์เรย์จะมี 3 องค์ประกอบ: hello, และworldwibble
หากการทดแทนคำสั่งอยู่ในเครื่องหมายคำพูดคู่จะไม่มีการแยก คุณสามารถดำเนินการแยกที่กำหนดเองกับธงขยายตัวพารามิเตอร์ ใช้การ@ตั้งค่าสถานะเพื่อระบุว่าผลลัพธ์ของการแยกจะเป็นอาร์เรย์ (ผิดปกติคุณต้องคงการขยายในเครื่องหมายคำพูดคู่เช่น"${(@)…}"แม้ว่าสตริงที่ยกมาสองครั้งจะขยายไปหลายคำ) สำหรับการแบ่งให้ใช้sธงเช่น"${(@s:,:)…}"แยกที่เครื่องหมายจุลภาค การfแบ่งธงที่บรรทัดใหม่เท่านั้น
files=("${(@f)$(ls)}")
โปรดทราบว่าวิธีที่เหมาะสมในการวนซ้ำแถวทั่วไปโดยทั่วไปจะfor f in $files[@]เป็นการ$filesดึงองค์ประกอบที่ว่างเปล่าออก (ที่นี่มันไม่สำคัญเพราะองค์ประกอบจะไม่ว่างเปล่า)
print $fตีความ$fว่าเป็นสวิทช์ถ้ามันเริ่มต้นด้วยและขยายเครื่องหมายใน- $fใช้print -r -- $fหรือprint -rn -- $fถ้าคุณไม่ต้องการเพิ่มบรรทัดใหม่หลังสตริง