Nếu bạn trực tiếp sử dụng các chuỗi trong một for
vòng lặp, nó sẽ hoạt động theo từng từ (ở đây trên một từ: toàn bộ nội dung $test
kể từ khi nó được trích dẫn), không phải mỗi ký tự. Bạn cần sử dụng một while
vòng lặp read
để phân tích từng chữ cái hoặc để giới thiệu một tham số số sẽ lặp qua chuỗi.
Ngoài ra, khi sử dụng read
, bạn cần đảm bảo rằng các dòng mới và khoảng trắng không được hiểu là dấu phân cách và buộc read
phải đọc một char mỗi lần.
Đây là phiên bản hoạt động:
#!/bin/bash
test="this is a
test"
printf %s "$test" | while IFS= read -r -N 1 a; do
if [[ "$a" == $'\n' ]] ; then
echo "FOUND NEWLINE"
fi
printf %s "$a"
done
Bạn có thể thay thế $'\n'
bằng $'\012'
hoặc $'\x0a'
, vì tất cả chúng đều đại diện cho cùng một mã dòng mới. Nhưng nó không giống như \015
hoặc \r
- điều này là viết tắt của quay trở lại vận chuyển (trở về đầu dòng). Trên các hệ thống Linux, các dòng mới được trình bày bằng cách sử dụng \n
, nhưng trên Windows chẳng hạn, chúng được thể hiện bằng một chuỗi \r\n
thay thế. Đó là lý do tại sao nếu bạn có một tệp văn bản từ Windows, bạn cũng có thể phát hiện các dòng mới bằng cách tìm kiếm \r
.
cat | while read line; do ...; done
, bạn sẽ biết có một giá trị vận chuyển cho mỗi lần lặp. Nếu đầu vào của bạn có thể là các tệp\r
mà không có\n
, chỉ cần chuyển đổi tệptr '\r' '\n'
trong khi xử lý đầu vào. Nếu bạn chỉ cần biết nếu có nhiều dòng :wc -l
.