Theo định nghĩa , một tệp văn bản bao gồm một chuỗi các dòng. Một dòng kết thúc với một ký tự dòng mới. Do đó, một tệp văn bản kết thúc bằng một ký tự dòng mới, trừ khi nó trống.
Nội dung read
chỉ có nghĩa là để đọc các tập tin văn bản. Bạn không truyền tệp văn bản, vì vậy bạn không thể hy vọng nó hoạt động trơn tru. Shell đọc tất cả các dòng - những gì nó bỏ qua là các ký tự phụ sau dòng cuối cùng.
Nếu bạn có một tệp đầu vào có khả năng không đúng định dạng có thể thiếu dòng cuối cùng của nó, bạn có thể thêm một dòng mới vào nó, chỉ để chắc chắn.
{ cat "/tmp/urlFile"; echo; } | …
Các tệp phải là tệp văn bản nhưng thiếu dòng mới cuối cùng thường được tạo bởi các biên tập viên Windows. Điều này thường đi cùng với các kết thúc dòng Windows, đó là CR LF, trái ngược với LF của Unix. Ký tự CR hiếm khi hữu ích ở mọi nơi và không thể xuất hiện trong URL trong mọi trường hợp, vì vậy bạn nên xóa chúng.
{ <"/tmp/urlFile" tr -d '\r'; echo; } | …
Trong trường hợp tệp đầu vào được định dạng tốt và kết thúc bằng một dòng mới, thì echo
thêm một dòng trống. Vì các URL không thể để trống, chỉ cần bỏ qua các dòng trống.
Cũng lưu ý rằng read
không đọc các dòng theo cách đơn giản. Nó bỏ qua khoảng trắng hàng đầu và dấu, mà đối với một URL có thể là mong muốn. Nó xử lý dấu gạch chéo ngược ở cuối dòng là một ký tự thoát, làm cho dòng tiếp theo được nối với dấu đầu tiên trừ chuỗi backslash-newline, điều này chắc chắn không được mong muốn. Vì vậy, bạn nên vượt qua -r
tùy chọn để read
. Nó là rất, rất hiếm read
khi là điều đúng hơn là read -r
.
{ <"/tmp/urlFile" tr -d '\r'; echo; } | while read -r url
do
if [ -z "$url" ]; then continue; fi
…
done