2010-02-25 6 views
10

Đây là những gì tôi đang cố gắng. Những gì tôi muốn là cuối cùng echo để nói "một hai ba bốn test1 ..." như nó vòng. Nó không hoạt động; read line sắp hết trống. Có điều gì đó tinh tế ở đây hay là điều này sẽ không hoạt động?Tôi có thể đọc dòng từ một heredoc trong bash không?

array=(one two three) 
echo ${array[@]} 
#one two three 
array=(${array[@]} four) 
echo ${array[@]} 
#one two three four 


while read line; do 
     array=(${array[@]} $line) 
     echo ${array[@]} 
done < <(echo <<EOM 
test1 
test2 
test3 
test4 
EOM 
) 
+0

'mảng + = ("tứ đại gia") 'và' mảng + = ("dòng $") ' –

Trả lời

16

Tôi thường viết:

while read line 
do 
    array=(${array[@]} $line) 
    echo ${array[@]} 
done <<EOM 
test1 
test2 
test3 
test4 
EOM 

Hoặc, thậm chí nhiều khả năng:

cat <<EOF | 
test1 
test2 
test3 
test4 
EOF 

while read line 
do 
    array=(${array[@]} $line) 
    echo ${array[@]} 
done 

(Lưu ý rằng phiên bản với một đường ống sẽ không nhất thiết phải phù hợp trong Bash The Bourne. shell sẽ chạy vòng lặp while trong trình bao hiện tại, nhưng Bash chạy nó trong một vỏ con - ít nhất là theo mặc định. Trong vỏ Bourne, các phép gán được thực hiện trong vòng lặp sẽ có sẵn trong chính vỏ sau vòng lặp; trong Bash, họ không. Phiên bản đầu tiên luôn đặt biến mảng để nó có sẵn để sử dụng sau khi vòng lặp)

Bạn cũng có thể sử dụng:.

array+=($line) 

để thêm vào mảng.

4

thay

done < <(echo <<EOM 

với

done < <(cat << EOM 

Làm việc cho tôi.

1

Bạn có thể đặt lệnh trước khi thay vì:

(echo <<EOM 
test1 
test2 
test3 
test4 
EOM 
) | while read line; do 
     array=(${array[@]} $line) 
     echo ${array[@]} 
done 
+0

Và như sha nói, mèo có lẽ là thích hợp hơn là tiếng vang ở đây. – hlovdal