này được bao phủ trong Bash mục Hỏi đáp về reading data line-by-line.
Lệnh đọc sửa đổi từng dòng đọc; theo mặc định, nó loại bỏ tất cả các ký tự khoảng trắng đầu và cuối (dấu cách và tab hoặc bất kỳ ký tự khoảng trống nào có trong IFS). Nếu đó là không mong muốn, biến IFS phải được xóa:
# Exact lines, no trimming
while IFS= read -r line; do
printf '%s\n' "$line"
done < "$file"
Như Charles Duffy một cách chính xác chỉ ra (và tôi muốn bỏ bằng cách tập trung vào các vấn đề IFS
); nếu bạn muốn xem các khoảng trống trong đầu ra của bạn, bạn cũng cần báo giá biến khi bạn sử dụng nó hoặc trình bao sẽ, một lần nữa, thả khoảng trắng.
Lưu ý về một số khác biệt khác trong đoạn trích được trích dẫn so với mã ban đầu của bạn.
Việc sử dụng đối số -r
cho read
được bao gồm trong một câu duy nhất ở đầu trang được liên kết trước đó.
Tùy chọn -r để đọc ngăn chặn việc giải thích dấu gạch chéo ngược (thường được sử dụng như cặp đường chéo ngược dòng mới, để tiếp tục qua nhiều dòng). Nếu không có tùy chọn này, mọi dấu gạch chéo ngược trong đầu vào sẽ bị hủy. Bạn hầu như luôn luôn nên sử dụng tùy chọn -r với đọc.
Như việc sử dụng printf
thay vì echo
có hành vi của echo
là, một chút không may, không portably nhất quán trên tất cả các môi trường và sự khác biệt có thể khó khăn khi phải đối phó với. printf
mặt khác là phù hợp và có thể được sử dụng hoàn toàn mạnh mẽ.
Nguồn
2015-04-17 02:26:42
Nếu bạn không cho 'đọc' bất kỳ đối số nào để sử dụng để giữ đầu vào (dựa vào biến mặc định' REPLY'), không có khoảng trống nào bị tước và bạn có thể bỏ qua sửa đổi thành 'IFS'. Tức là, 'trong khi đọc -r; làm printf '% s \ n' "$ REPLY"; đã thực hiện <"$ file" ' – chepner
@chepner Thú vị. Tôi tự hỏi tại sao vậy. –
Tôi không chắc chắn; nó dường như không được ghi chép như xa như tôi có thể nói. Nó có ý nghĩa nếu bạn nghĩ về nó như là không đối số yêu cầu chia dòng thành 0 lĩnh vực, có nghĩa là không có sử dụng cho 'IFS'. (Điều đó giả sử bạn chấp nhận rằng việc chia tách một dòng thành một trường vẫn là một sự chia tách, mặc dù là một sự thoái hóa.) Trong mọi trường hợp, nó là một 'bash'ism; POSIX 'read' yêu cầu ít nhất một đối số. – chepner