Để đọc tệp văn bản theo nghĩa đen, không sử dụng đơn giản read
, xử lý đầu ra theo hai cách:
read
giải thích \
như một nhân vật thoát; sử dụng read -r
để tắt cái này
read
chia thành các từ trên các ký tự trong $IFS
; đặt IFS
thành một chuỗi trống để tắt cái này
Thành ngữ thông thường để xử lý một dòng tệp văn bản theo dòng là
while IFS= read -r line; do …
Để giải thích về thành ngữ này, hãy xem Tại sao được while IFS= read
sử dụng thường xuyên như vậy, thay vì IFS=; while read..
? .
Để viết một chuỗi theo nghĩa đen, đừng chỉ sử dụng đơn giản echo
, mà xử lý chuỗi theo hai cách:
- Trên một số shell,
echo
xử lý dấu gạch chéo ngược thoát. (Trên bash, tùy thuộc vào việc xpg_echo
tùy chọn có được đặt hay không.)
- Một vài chuỗi được coi là tùy chọn, ví dụ
-n
hoặc -e
(bộ chính xác phụ thuộc vào vỏ).
Một cách di động để in một chuỗi theo nghĩa đen là với printf
. (Không có cách nào tốt hơn trong bash, trừ khi bạn biết đầu vào của mình không giống như một tùy chọn echo
.) Sử dụng mẫu đầu tiên để in chuỗi chính xác và mẫu thứ hai nếu bạn muốn thêm một dòng mới.
printf %s "$line"
printf '%s\n' "$line"
Điều này chỉ phù hợp để xử lý văn bản , bởi vì:
- Hầu hết các shell sẽ sặc trên các ký tự null trong đầu vào.
- Khi bạn đã đọc dòng cuối cùng, bạn không có cách nào để biết liệu có một dòng mới ở cuối hay không. (Một số shell cũ hơn có thể gặp rắc rối lớn hơn nếu đầu vào không kết thúc bằng một dòng mới.)
Bạn không thể xử lý dữ liệu nhị phân trong hệ vỏ, nhưng các phiên bản hiện đại của tiện ích trên hầu hết các đơn vị có thể đối phó với dữ liệu tùy ý. Để chuyển tất cả đầu vào thông qua đầu ra, sử dụng cat
. Đi trên một tiếp tuyến, echo -n ''
là một cách phức tạp và không di động để làm gì; echo -n
sẽ tốt như vậy (hoặc không phụ thuộc vào vỏ), và :
đơn giản hơn và hoàn toàn di động.
: >| "$file"
cat >>"$file"
hoặc, đơn giản hơn,
cat >|"$file"
Trong một tập lệnh, bạn thường không cần sử dụng >|
vì noclobber
bị tắt theo mặc định.