Nối vào cùng một mảng trong các vòng lặp khác nhau, chỉ các giá trị cuối cùng vẫn là Bash 4


7

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

FILES=()
for i in *.map
do
    FILES+=($i)
done

find /var/candy -name "chocolate_[0-9]" | while read snack
do
    FILES+=($snack)
done

for file in ../out/amsterdam/apples/{system.map,vmlinux}
do
    FILES+=($file)
done

Nhưng mảng kết thúc chỉ chứa ../out/amsterdam/apples/system.map../out/amsterdam/apples/vmlinux. Điều gì đã xảy ra với các giá trị khác? Tôi biết chúng tồn tại trong các vòng lặp đó bởi vì tôi lặp lại để đảm bảo các biến chứa thứ gì đó.

Câu trả lời:


13

Lấy từ Bash FAQ :

Tôi đặt các biến trong một vòng lặp trong một đường ống. Tại sao chúng biến mất sau khi vòng lặp chấm dứt?

Lý do cho hành vi có khả năng gây ngạc nhiên này, như được mô tả ở trên, là mỗi SubShell giới thiệu một bối cảnh và môi trường biến mới. Vòng lặp while ở trên được thực thi trong một lớp con mới với bản sao riêng của dòng linecount được tạo với giá trị ban đầu là '0' được lấy từ vỏ cha. Bản sao này sau đó được sử dụng để đếm. Khi vòng lặp while kết thúc, bản sao của lớp con sẽ bị loại bỏ và dòng biến ban đầu của cha mẹ (có giá trị không thay đổi) được sử dụng trong lệnh echo.

Để tránh một lớp con không được tạo trong vòng lặp thứ hai của bạn, bạn có thể cung cấp dữ liệu cho nó theo các cách khác ngoài đường ống:

while read snack; do
    FILES+=($snack)
done < <(find /var/candy -name "chocolate_[0-9]")

.

while read snack; do
    FILES+=($snack)
done <<<"$(find /var/candy -name "chocolate_[0-9]")"

Nếu tôi có một hàm như append () {FILES + = $ 1; } và sau đó cho mỗi vòng lặp làm cho i trong (bất cứ điều gì); làm thêm $ i; xong
Gregg Leventhal

Ví dụ trong bình luận của bạn ở trên hoạt động. Hãy nhớ rằng vấn đề bạn gặp phải chỉ xuất hiện trong vòng lặp thứ hai chứa đường ống. Tôi sẽ cập nhật câu trả lời của tôi.
Teresa e Junior
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.