2010-02-25 9 views
10

Voici ce que j'essaie. Ce que je veux c'est le dernier echo à dire "un deux trois quatre test1 ..." comme il boucle. Ça ne fonctionne pas; read line arrive à vide. Y a-t-il quelque chose de subtil ici ou est-ce que ça ne va pas marcher?Puis-je lire la ligne d'un heredoc dans bash?

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

'Tableau + = ("quatre")' et 'tableau + = ("$ ligne")' –

Répondre

16

Je normalement écrire:

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

Ou, encore plus probable:

cat <<EOF | 
test1 
test2 
test3 
test4 
EOF 

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

(Notez que la version avec un tuyau ne sera pas nécessairement approprié dans Bash The Bourne. shell exécute la boucle while dans le shell actuel, mais Bash l'exécute dans un sous-shell - au moins par défaut Dans le shell Bourne, les assignations faites dans la boucle seront disponibles dans le shell principal. shell après la boucle; à Bash, ils ne le sont pas. La première version définit toujours la variable tableau il est donc disponible pour une utilisation après la boucle)

Vous pouvez également utiliser:.

array+=($line) 

à ajouter au tableau.

4

remplacer

done < <(echo <<EOM 

avec

done < <(cat << EOM 

travaillé pour moi.

1

Vous pouvez mettre la commande devant tout lieu:

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

Et comme sha dit, le chat est probablement plus approprié que l'écho ici. – hlovdal