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