J'ai une variable qui contient une chaîne délimitée par des espaces:
line="1 1.50 string"
Je veux diviser cette chaîne avec de l'espace comme délimiteur et stocker le résultat dans un tableau, de sorte que les éléments suivants:
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 j'exécute les instructions echo ci-dessus après cela, j'obtiens:
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-il m'aider, s'il vous plaît?
set -f; arr=($string); set +f
semble être plus rapide queread -r -a <<< $string
.Réponses:
Afin de convertir une chaîne en tableau, veuillez utiliser
ou
Il est crucial de ne pas utiliser de guillemets car cela fait l'affaire.
la source
for i in ${arr[@]}; do echo $i; done
echo ${arr[@]}
$line
contiennent des caractères globbing.mkdir x && cd x && touch A B C && line="*" arr=($line); echo ${#arr[@]}
donne 3declare -a "arr=($line)"
ignorera lesIFS
délimiteurs à l'intérieur des chaînes citéesline='*'
,read -a arr <<<$line
toujours travailler, maisarr=($line)
échoue seulement .Essaye ça:
la source
line='*'
Dans:
arr=( $line )
. Le "split" est associé à "glob".Les caractères génériques (
*
,?
et[]
) seront étendus aux noms de fichiers correspondants.La bonne solution n'est que légèrement plus complexe:
Aucun problème de globbing; le caractère fractionné est défini dans
$IFS
, variables citées.la source
arr=($line)
de la réponse acceptée souffre de problèmes de globalisation. Par exemple, essayez:line="twinkling *"; arr=($line); declare -p arr
.<<<
mais il peut être judicieux de toujours utiliser des guillemets doubles pour la cohérence et la lisibilité.Si vous avez besoin d'une extension des paramètres, essayez:
Par exemple, prenez le code suivant.
Si le répertoire actuel contenait les fichiers
a.txt
,b.txt
etc.txt
, alors l'exécution du code produirait la sortie suivante.la source
la source
tr
est superflu mais il devrait boucler à la"${arr[@]}"
place, pas$arr