Bạn nên sử dụng printf
thay vìecho
:
printf "%s\n" "${mtches[@]}"
Nếu mtches
trống mà vẫn xuất ra một dòng trống. Để giải thích cho điều đó:
{ [ "${#mtches[@]}" -eq 0 ] || printf '%s\n' "${mtches[@]}"; } > file
Trong bash
(và cũng vỏ POSIX), bạn thường sử dụng mảng Positional Parameters như "$@"
thay vì "$*"
, trừ khi bạn có một lý do đặc biệt. Điều đó cũng đúng trong các shell hỗ trợ các mảng thông thường, từ man bash - phần Mảng :
Bất kỳ phần tử nào của một mảng có thể được tham chiếu bằng $ {name [subscript]}. Các dấu ngoặc nhọn được yêu cầu để tránh xung đột với các toán tử mở rộng tên tệp của shell. Nếu chỉ mục là '@' hoặc '*', từ sẽ mở rộng cho tất cả các thành viên của tên mảng. Các mục con này chỉ khác nhau khi từ xuất hiện trong dấu ngoặc kép. Nếu từ được trích dẫn kép, $ {name [*]} sẽ mở rộng thành một từ duy nhất với giá trị của từng thành viên mảng được phân tách bằng ký tự đầu tiên của biến IFS và $ {name [@]} mở rộng từng thành phần của tên đến một từ riêng biệt. Khi không có thành viên mảng, $ {name [@]} sẽ mở rộng thành không có gì. Nếu việc mở rộng trích dẫn kép xảy ra trong một từ, thì việc mở rộng tham số đầu tiên được nối với phần đầu của từ gốc và việc mở rộng tham số cuối cùng được nối với phần cuối của từ gốc.
Chỉ sử dụng "${array[*]}"
khi bạn muốn nối tất cả các thành phần mảng thành một chuỗi.