Comment pourrais-je lire les entrées utilisateur sous forme de tableau dans le bash
shell?
./array_test.sh < war_and_peace.txt
.
Comment pourrais-je lire les entrées utilisateur sous forme de tableau dans le bash
shell?
./array_test.sh < war_and_peace.txt
.
Réponses:
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:
Le Guide avancé de Bash-Scripting a un grand chapitre sur les tableaux
La page de manuel de la lecture intégrée
15 exemples de tableaux de thegeekstuff.com
read -r
est 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).
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.
IFS
problème. Sans l'annuler, 'read' sripts tous les espaces blancs avant et arrière ... et bien sûr -r
aussi ...
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 read
pour 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 read
ne fait rien quand stdin
est 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 b
ce 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 .
cat war_and_peace.txt | ./array_test.sh
.