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?
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.
Essaye ça:
arr=(`echo ${line}`);
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.
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