ฉันคิดว่าต่อไปนี้จะจัดกลุ่มผลลัพธ์ของmy_command
อาร์เรย์หลายบรรทัด:
IFS='\n' array_of_lines=$(my_command);
ดังนั้น$array_of_lines[1]
จะหมายถึงบรรทัดแรกในผลลัพธ์ของmy_command
, $array_of_lines[2]
ถึงวินาทีและอื่น ๆ
อย่างไรก็ตามคำสั่งด้านบนนั้นใช้งานไม่ได้ ดูเหมือนว่าจะแยกเอาท์พุทของmy_command
ตัวละครรอบตัวn
ออกไปตามที่ฉันได้ตรวจสอบด้วยprint -l $array_of_lines
ซึ่งฉันเชื่อว่ามันจะพิมพ์องค์ประกอบของอาเรย์ทีละบรรทัด ฉันได้ตรวจสอบสิ่งนี้ด้วย:
echo $array_of_lines[1]
echo $array_of_lines[2]
...
ในความพยายามครั้งที่สองฉันคิดว่าการเพิ่มeval
จะช่วยได้:
IFS='\n' array_of_lines=$(eval my_command);
แต่ฉันได้ผลลัพธ์เหมือนกันทุกประการ
ในที่สุดต่อไปนี้คำตอบเกี่ยวกับองค์ประกอบของรายการที่มีช่องว่างใน zshฉันยังได้ลองใช้การตั้งค่าสถานะการขยายพารามิเตอร์แทนที่จะIFS
บอก zsh วิธีการแยกอินพุตและรวบรวมองค์ประกอบเป็นอาร์เรย์เช่น:
array_of_lines=("${(@f)$(my_command)}");
แต่ฉันยังคงได้รับผลลัพธ์เดียวกัน (แยกเกิดขึ้นn
)
ด้วยสิ่งนี้ฉันมีคำถามต่อไปนี้:
ไตรมาสที่ 1 อะไรคือ"วิธีการที่เหมาะสม"ในการรวบรวมเอาต์พุตของคำสั่งในอาร์เรย์ของบรรทัด?
ไตรมาสที่ 2 ฉันIFS
จะระบุให้แยกบรรทัดใหม่ได้อย่างไร
ไตรมาสที่ 3 หากฉันใช้การตั้งค่าสถานะการขยายพารามิเตอร์เช่นเดียวกับในความพยายามครั้งที่สามของฉันข้างต้น (เช่นการใช้@f
) เพื่อระบุการแยก zsh จะละเว้นค่าเป็นIFS
หรือไม่? ทำไมมันไม่ทำงานด้านบน
"${(@f)...}"
เหมือนกัน${(f)"..."}
แต่แตกต่างกัน(@)
ภายในเครื่องหมายคำพูดคู่หมายถึง“ ให้ผลตอบแทนหนึ่งคำต่อองค์ประกอบอาร์เรย์” และ(f)
หมายถึง“ แบ่งออกเป็นอาร์เรย์โดยขึ้นบรรทัดใหม่” PS: โปรดลิงค์ไปที่เอกสาร