Here's what I'm trying. What I want is the last echo
to say "one two three four test1..." as it loops. It's not working; read line
is coming up empty. Is there something subtle here or is this just not going to work?
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
)
I would normally write:
while read line
do
array=( ${array[@]} $line )
echo ${array[@]}
done <<EOM
test1
test2
test3
test4
EOM
Or, even more likely:
cat <<EOF |
test1
test2
test3
test4
EOF
while read line
do
array=( ${array[@]} $line )
echo ${array[@]}
done
(Note that the version with a pipe will not necessarily be suitable in Bash. The Bourne shell would run the while
loop in the current shell, but Bash runs it in a subshell — at least by default. In the Bourne shell, the assignments made in the loop would be available in the main shell after the loop; in Bash, they are not. The first version always sets the array variable so it is available for use after the loop.)
You could also use:
array+=( $line )
to add to the array.
replace
done < <( echo <<EOM
with
done < <(cat << EOM
Worked for me.
You can put the command in front of while instead:
(echo <<EOM
test1
test2
test3
test4
EOM
) | while read line; do
array=( ${array[@]} $line )
echo ${array[@]}
done
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With