2012-02-15 14 views
133

Ho una variabile che contiene una stringa spazio delimitato:Lettura di una stringa delimitata in una matrice in Bash

line="1 1.50 string" 

voglio dividere la stringa con lo spazio come delimitatore e memorizzare il risultato in un array, cosicché i seguenti:

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

uscite

1 
1.50 
string 

qualche parte ho trovato una soluzione che non fa lavoro:

arr=$(echo ${line}) 

Se corro le istruzioni echo suddette dopo questo, ottengo:

1 1.50 string 
[empty line] 
[empty line] 

Ho anche provato

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

con lo stesso risultato. Qualcuno può aiutare, per favore?

risposta

220
arr=($line) 

o

read -a arr <<<$line 
+26

+1. In questo caso è cruciale lasciare la variabile non quotata. –

+4

e per fare un controllo di integrità del tuo nuovo bellissimo array: 'for i in $ {arr [@]}; fai eco $ i; done' – Banjer

+4

o semplicemente 'echo $ {arr [@]}' – Banjer

32

Prova questa:

arr=(`echo ${line}`); 
+0

Grazie per averlo risolto :) – Randy

+3

arr = ($ (echo $ {line}) funziona anche –

+4

Nice - Questa soluzione funziona anche nella shell Z dove alcuni degli altri approcci sopra falliscono. –

-7
line="1 1.50 string" 

arr=$($line | tr " " "\n") 

for x in $arr 
do 
echo "> [$x]" 
done 
+0

Sembra non funzionare affatto. –

+0

Il looping è errato, divide bene l'array e il pipe in 'tr' è superfluo, ma dovrebbe scorrere su' "$ {arr [@]}" 'invece, non' $ arr' – Zorf

8

In: arr=($line). Lo "split" viene associato a "glob".
I caratteri jolly (*, ? e []) verranno estesi ai nomi dei file corrispondenti.

La soluzione corretta è solo leggermente più complessa:

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

Nessun problema globbing; il carattere suddiviso è impostato su $IFS, variabili quotate.

Problemi correlati