Sau đây đọc một tệp được truyền dưới dạng một dòng đối số theo dòng:
while IFS= read -r line; do
echo "Text read from file: $line"
done < my_filename.txt
Đây là hình thức tiêu chuẩn để đọc các dòng từ một tệp trong một vòng lặp. Giải trình:
IFS=
(hoặc IFS=''
) ngăn không gian hàng đầu / dấu vết bị cắt bớt.
-r
ngăn chặn dấu gạch chéo ngược thoát khỏi bị giải thích.
Hoặc bạn có thể đặt nó trong tập lệnh trình trợ giúp tệp bash, nội dung ví dụ:
#!/bin/bash
while IFS= read -r line; do
echo "Text read from file: $line"
done < "$1"
Nếu ở trên được lưu vào một tập lệnh có tên tệp readfile
, nó có thể được chạy như sau:
chmod +x readfile
./readfile filename.txt
Nếu tệp không phải là tệp văn bản POSIX tiêu chuẩn (= không bị chấm dứt bởi ký tự dòng mới), vòng lặp có thể được sửa đổi để xử lý các dòng một phần:
while IFS= read -r line || [[ -n "$line" ]]; do
echo "Text read from file: $line"
done < "$1"
Ở đây, || [[ -n $line ]]
ngăn dòng cuối cùng bị bỏ qua nếu nó không kết thúc bằng một \n
(vì read
trả về mã thoát khác không khi nó gặp EOF).
Nếu các lệnh bên trong vòng lặp cũng đọc từ đầu vào tiêu chuẩn, bộ mô tả tệp được sử dụng read
có thể được chuyển sang một thứ khác (tránh các bộ mô tả tệp tiêu chuẩn ), ví dụ:
while IFS= read -r -u3 line; do
echo "Text read from file: $line"
done 3< "$1"
(Các vỏ không phải Bash có thể không biết read -u3
; sử dụng read <&3
thay thế.)