91 votes

Capture de la sortie multiligne comme tableau en bash

Si inner.sh est

#...
echo first
echo second
echo third

Et outer.sh est

var=`./inner.sh`
# only wants to use "first"...  

Comment var doit-il être séparé par des espaces ?

137voto

sampson-chen Points 13413

Essayez ça :

var=($(./inner.sh))

# And then test the array with:

echo ${var[0]}
echo ${var[1]}
echo ${var[2]}

Sortie :

first
second
third

Explication :

  • Vous pouvez créer un tableau en bash en faisant var=(first second third) par exemple.
  • $(./inner.sh) exécute le inner.sh script, qui imprime first , second et third sur des lignes séparées. Puisque nous n'avons pas mis de guillemets autour de $(...) ils sont regroupés sur la même ligne, mais séparés par des espaces, ce qui donne le résultat décrit dans le point précédent.

55voto

gniourf_gniourf Points 9393

N'oubliez pas la fonction intégrée mapfile . C'est certainement le plus efficace dans votre cas : Si vous voulez faire passer le fichier entier dans un tableau, dont les champs seront les lignes sorties par ./inner.sh , faire

mapfile -t array < <(./inner.sh)

Vous aurez alors la première ligne dans ${array[0]} etc...

Pour plus d'informations sur ce module et toutes les options possibles :

help mapfile

Si vous avez juste besoin de la première ligne dans une variable appelée firstline , faire

read -r firstline < <(./inner.sh)

Ce sont certainement les moyens les plus efficaces !

Ce petit repère va le prouver :

$ time mapfile -t array < <(for i in {0..100000}; do echo "fdjsakfjds$i"; done)

real    0m1.514s
user    0m1.492s
sys 0m0.560s
$ time array=( $(for i in {0..100000}; do echo "fdjsakfjds$i"; done) )

real    0m2.045s
user    0m1.844s
sys 0m0.308s

Si vous voulez seulement le premier mot (avec le délimiteur d'espace) de la première ligne produite par ./inner.sh le moyen le plus efficace est

read firstword _ < <(./inner.sh)

9voto

Arnestig Points 1015

Vous ne séparez pas sur les espaces mais plutôt sur les nouvelles lignes. Essayez ceci :

IFS=$'
'

var=$(./echo.sh)
echo $var | awk '{ print $1 }'
unset IFS

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X