web-dev-qa-db-fra.com

Lecture d'une chaîne délimitée dans un tableau dans Bash

J'ai une variable qui contient une chaîne délimitée par des espaces:

line="1 1.50 string"

Je souhaite scinder cette chaîne avec un espace comme séparateur et stocker le résultat dans un tableau, de sorte que:

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

les sorties

1
1.50
string

Quelque part, j'ai trouvé une solution qui ne fonctionne pas:

arr=$(echo ${line})

Si je lance les instructions d'écho ci-dessus après cela, je reçois:

1 1.50 string
[empty line]
[empty line]

J'ai aussi essayé

IFS=" "
arr=$(echo ${line})

avec le même résultat. Quelqu'un peut aider, s'il vous plaît?

190
Nikola Novak

Pour convertir une chaîne en tableau, veuillez utiliser

arr=($line)

ou

read -a arr <<< $line

Il est crucial de ne pas utiliser de guillemets car cela fait l'affaire.

299
kev

Essaye ça:

arr=(`echo ${line}`);
37
Randy

Dans: arr=( $line ). Le "split" est associé à "glob".
Les caractères génériques (*, ? et []) seront étendus aux noms de fichiers correspondants.

La solution correcte n’est que légèrement plus complexe:

IFS=' ' read -a arr <<< "$line"

Aucun problème de globbing; le caractère séparé est défini dans $IFS, variables citées.

24
sorontar

Si vous avez besoin d'une extension de paramètre, essayez alors:

eval "arr=($line)"

Par exemple, prenons le code suivant.

line='a b "c d" "*" *'
eval "arr=($line)"
for s in "${arr[@]}"; do 
    echo "$s"
done

Si le répertoire en cours contenait les fichiers a.txt, b.txt et c.txt, l'exécution du code produirait la sortie suivante.

a
b
c d
*
a.txt
b.txt
c.txt
4
David Anderson