2012-10-29 28 views

Trả lời

48

Bạn có thể viết:

while IFS= read -r line 
do 
    echo "$line" 
done <<< "$the_list" 

Xem §3.6.7 "Here Strings" in the Bash Reference Manual.

(Tôi cũng lấy sự tự do của việc thêm một số dấu nháy kép, và thêm -rIFS=-read, để tránh quá nhiều mucking xung quanh với các nội dung của các biến của bạn.)

+2

Liệu 'IFS =' có đặt IFS thành ký tự rỗng không? Tại sao bạn cần nó trong trường hợp này? – doubleDown

+6

@doubleDown: 'IFS =' đặt '$ IFS' thành chuỗi rỗng (vì vậy nó không chứa bất kỳ ký tự nào). Trong trường hợp này, vì chỉ có một trường, hiệu ứng duy nhất của nó là ngăn chặn việc loại bỏ các ký tự IFS hàng đầu từ đầu dòng. (Để xem ý tôi là gì, hãy so sánh 'read foo <<< 'bar'; echo" $ foo "' với 'IFS = đọc foo <<< 'bar'; echo" $ foo "'.) – ruakh

15

Bạn chỉ có thể sử dụng

your_code | while read line; 
do 
    echo $line 
done 

nếu bạn không nhớ các vòng lặp trong khi thực hiện trong một vỏ bọc con (bất kỳ biến nào bạn sửa đổi sẽ không hiển thị trong trang mẹ sau done).

+0

tuyệt vời! cảm ơn rất nhiều! –

22

Nếu bạn không sử dụng biến cho bất kỳ điều gì khác, thậm chí bạn có thể thực hiện mà không có nó:

while read line ; do 
    echo $line 
done < <(... code ...) 
-1

Tệp tập lệnh phải ở chế độ Linux. Trước đây nó đã ở chế độ dos. Tôi đã thay đổi nó bằng cách sử dụng dos2unix filename.

ví dụ .:

dos2unix sshcopy.sh 

Bây giờ nó làm việc cho tôi.

+0

Câu trả lời được đề xuất bởi [ruakh] (http://stackoverflow.com/a/13122491/622391) đã được người hỏi chấp nhận. Điều này có nghĩa rằng vấn đề là _not_ liên quan đến định dạng tệp của tập lệnh. –

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