Lặp lại chuỗi nhiều dòng được lưu trữ trong biến


17

Tôi đọc rằng thật tệ khi viết những thứ như thế for line in $(command), cách chính xác dường như là thay vào đó:

command | while IFS= read -r line; do echo $line; done

Điều này làm việc tuyệt vời. Nhưng nếu những gì tôi muốn lặp lại là nội dung của một biến , không phải là kết quả trực tiếp của một lệnh thì sao?

Ví dụ, hãy tưởng tượng rằng bạn tạo tệp sau quickfox:

The quick brown
foxjumps\ over -
the
lazy ,
dog.

Tôi muốn có thể làm một cái gì đó như thế này:

# This is just for the example,
# I could of course stream the contents to `read`
variable=$(cat quickfox);
while IFS= read -r line < $variable; do echo $line; done; # this is incorrect

Câu trả lời:


18

Trong các shell hiện đại như bash và zsh, bạn có một bộ chuyển hướng `<<< 'rất hữu ích, chấp nhận một chuỗi làm đầu vào. Vì vậy, bạn sẽ làm

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

Nếu không, bạn luôn có thể làm

echo "$variable" | while IFS= read -r line ; do echo $line; done

Xin lỗi, tôi nên nghĩ về việc lặp lại nội dung của khóa học. Nhưng cảm ơn vì câu trả lời nhanh nào!
Sheljohn

1
bạn cần trích dẫn kép $variablekhi bạn sử dụng nó, nếu không whilevòng lặp sẽ chỉ nhận được một dòng đầu vào. Xem, ví dụ, sự khác biệt về sản lượng giữa echo $variablevs echo "$variable"hoặc cat <<< $variablevs cat <<< "$variable".
cas

@cas Thật ra nó phụ thuộc vào những gì bên trong biến $. Trong trường hợp được trình bày bởi OP ("biến = $ (cat quickfox)"), nó hoạt động mà không có dấu ngoặc kép bổ sung. Nhưng đối với trường hợp chung, bạn đúng. Tôi chỉnh sửa câu trả lời của tôi. Cảm ơn.
lgeorget

Bản variable=$(cat quickfox)thân câu hỏi của OP cung cấp một ví dụ về những gì tôi đã nói. Sử dụng $variablebên trong dấu ngoặc kép bao gồm các dòng mới, sử dụng nó mà không có dòng mới được dịch sang khoảng trắng bằng vỏ. Nếu bạn đang đọc và xử lý từng dòng một, điều này tạo ra một sự khác biệt lớn - với cái trước bạn có nhiều dòng đầu vào, với cái sau bạn chỉ có một dòng đầu vào. Dữ liệu đầu vào tương tự bề ngoài, nhưng trên thực tế, hoàn toàn khác nhau trong hai trường hợp đó.
cas

ví dụ: với dữ liệu đầu vào đó, cat <<< "$variable" | wc -ltrả về 5. cat <<< $variable | wc -ltrả về 1. Nếu bạn muốn / cần duy trì khoảng trắng (bao gồm dòng mới, tab, một hoặc nhiều khoảng trắng) trong một biến thì bạn PHẢI trích dẫn hai biến khi bạn sử dụng nó, nếu không tất cả chúng sẽ được chuyển thành một khoảng trống giữa mỗi "từ".
cas
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.