2011-12-30 37 views
33

Tôi muốn lặp qua danh sách các tệp mà không quan tâm đến các tên tệp có thể chứa, vì vậy tôi sử dụng danh sách được phân tách bằng ký tự rỗng. Mã sẽ giải thích mọi thứ tốt hơn.Đọc các chuỗi được phân cách bằng một vòng lặp Bash

# Set IFS to the null character to hopefully change the for..in 
# delimiter from the space character (sadly does not appear to work). 
IFS=$'\0' 

# Get null delimited list of files 
filelist="`find /some/path -type f -print0`" 

# Iterate through list of files 
for file in $filelist ; do 
    # Arbitrary operations on $file here 
done 

Mã sau hoạt động khi đọc từ tệp, nhưng tôi cần đọc từ một biến chứa văn bản.

while read -d $'\0' line ; do 
    # Code here 
done < /path/to/inputfile 
+1

Tôi không nghĩ rằng có thể lưu trữ các ký tự null trong biến bash. Ít nhất, tôi chưa bao giờ tìm được cách để làm điều đó ... –

Trả lời

53

Trong bash bạn có thể sử dụng một ở đây dây

while IFS= read -r -d '' line ; do 
    # Code here 
done <<<"$var" 

Lưu ý rằng bạn nên inline IFS= và chỉ sử dụng -d '' nhưng chắc chắn rằng có một khoảng trống giữa 'd' và đĩa đơn đầu tiên -Trích dẫn. Ngoài ra, hãy thêm cờ -r để bỏ qua các lần thoát.

Ngoài ra, đây không phải là một phần của câu hỏi của bạn nhưng tôi có thể đề xuất cách tốt hơn để làm kịch bản của bạn khi sử dụng find; nó sử dụng quá trình thay thế.

while IFS= read -r -d '' file; do 
    # Arbitrary operations on "$file" here 
done < <(find /some/path -type f -print0) 
+0

Tuyệt vời, chính xác những gì tôi đang tìm kiếm. Cảm ơn! Tôi đã sử dụng ví dụ thứ hai của bạn. – Matthew

+0

Việc sử dụng IFS kể từ khi cờ -d được thiết lập là gì? – thisirs

+4

@thisirs Bằng cách đặt 'IFS' thành chuỗi rỗng, các ký tự khoảng trống đầu và cuối sẽ được giữ nguyên. – toxalot

Các vấn đề liên quan