คุณควรใช้printfแทนecho :
printf "%s\n" "${mtches[@]}"
หากmtchesว่างเปล่าที่จะยังคงส่งออกหนึ่งบรรทัดว่าง เพื่อบัญชีที่:
{ [ "${#mtches[@]}" -eq 0 ] || printf '%s\n' "${mtches[@]}"; } > file
ในbash(และกระสุน POSIX) คุณมักจะใช้อาร์เรย์พารามิเตอร์ตำแหน่ง"$@"แทนแทนที่จะเป็น"$*"เว้นแต่คุณจะมีเหตุผลพิเศษ นอกจากนี้ยังเป็นจริงในเชลล์ที่สนับสนุนอาร์เรย์ปกติจาก man bash - อาเรย์ส่วน :
องค์ประกอบใด ๆ ของอาเรย์อาจถูกอ้างอิงโดยใช้ $ {name [subscript]} การจัดฟันจำเป็นต้องหลีกเลี่ยงความขัดแย้งกับตัวดำเนินการขยายชื่อไฟล์ของเชลล์ หากตัวห้อยคือ '@' หรือ '*' คำนั้นจะขยายไปยังสมาชิกทั้งหมดของชื่ออาเรย์ ตัวห้อยเหล่านี้แตกต่างกันเฉพาะเมื่อคำนั้นปรากฏภายในเครื่องหมายคำพูดคู่ หากคำนี้เป็นเครื่องหมายคำพูดสองครั้ง $ {name [*]} จะขยายเป็นคำเดียวโดยมีค่าของสมาชิกอาเรย์แต่ละตัวคั่นด้วยอักขระตัวแรกของตัวแปร IFS และ $ {name [@]} จะขยายแต่ละองค์ประกอบของชื่อ เป็นคำที่แยกกัน เมื่อไม่มีสมาชิกอาเรย์ $ {name [@]} จะไม่ขยายสิ่งใดเลย หากการขยายที่ยกมาสองครั้งเกิดขึ้นภายในคำการขยายตัวของพารามิเตอร์แรกจะถูกรวมเข้ากับส่วนเริ่มต้นของคำเดิมและการขยายตัวของพารามิเตอร์สุดท้ายจะรวมกับส่วนสุดท้ายของคำเดิม
ใช้"${array[*]}"เมื่อคุณต้องการรวมองค์ประกอบอาร์เรย์ทั้งหมดเข้ากับสตริงเท่านั้น