Comment lire les entrées utilisateur sous forme de tableau dans Bash?

15

Comment pourrais-je lire les entrées utilisateur sous forme de tableau dans le bashshell?

moata_u
la source
Je suppose que vous voulez lire depuis stdin? Ma réponse fonctionnera également avec l'exécution comme cat war_and_peace.txt | ./array_test.sh.
Stefano Palazzo
Ou tout simplement ./array_test.sh < war_and_peace.txt.
Eliah Kagan

Réponses:

14

Voici une façon de procéder:

while read line
do
    my_array=("${my_array[@]}" $line)
done

echo ${my_array[@]}

Si vous venez de l'exécuter, il continuera à lire à partir de l'entrée standard jusqu'à ce que vous appuyiez sur Ctrl + D (EOF). Ensuite, les lignes que vous avez saisies seront dans my_array. Certains peuvent trouver ce code déroutant. Le corps de la boucle dit essentiellement my_array = my_array + element.

Quelques documents intéressants:

Stefano Palazzo
la source
3
read -rest assez utile / important parfois ... Le lien de Stefano vers la "lecture de la page de manuel intégrée" explique son but ... (pour empêcher une interprétation barre oblique inverse).
Peter.O
10

Lisez-le en utilisant ceci:

read -a arr

Et pour l'impression, utilisez:

for elem in ${arr[@]}
do 
  echo $elem
done
ABcDexter
la source
4

Et celui qui ne recrée pas le tableau à chaque fois (mais nécessite bash 3.1 ou plus récent):

array=()
while IFS= read -r -p "Next item (end with an empty line): " line; do
    [[ $line ]] || break  # break if line is empty
    array+=("$line")
done

printf '%s\n' "Items read:"
printf '  «%s»\n' "${array[@]}"

Voir http://mywiki.wooledge.org/BashFAQ/001 pour en savoir plus.

Et comme toujours, pour éviter d'écrire des bogues, lisez http://mywiki.wooledge.org/BashGuide et évitez les guides tldp comme le guide de script Advanced bash.

geirha
la source
Bons liens ... Merci d'avoir signalé le IFSproblème. Sans l'annuler, 'read' sripts tous les espaces blancs avant et arrière ... et bien sûr -raussi ...
Peter.O
0

Que diriez-vous de ce one-liner;)

arr=( $(cat -) )
echo ${arr[@]}

Éditer:

Dans bash,

arr=(val1 val2 ...)

est la façon d' affecter à un tableau . En l'utilisant conjointement avec la substitution de commandes, vous pouvez lire des tableaux à partir du pipeline, ce qui n'est pas possible d'utiliser readpour accomplir cela de manière simple:

echo -e "a\nb" | read -a arr
echo ${arr[@]}

Vous constaterez qu'il ne produit rien du fait qu'il readne fait rien quand stdinest un tuyau car un pipeline peut être exécuté dans un sous-shell de sorte que la variable peut ne pas être utilisable du tout.

En utilisant la manière suggérée par cette réponse:

arr=(`echo -e "a\nb"`)
echo ${arr[@]}

Il donne a bce qui est beaucoup plus simple et plus simple que toute solution de contournement donnée par les réponses des valeurs de lecture dans une variable shell à partir d'un tuyau et en lecture bash après qu'un tuyau ne définit pas de valeurs .

Quark
la source
l'avez-vous testé?
cmak.fr
@ cmak.fr oui ça marche pour moi
Quark
@Melebius J'en ai joint une explication et l'avantage de ce one-liner.
JiaHao Xu