2012-04-12 10 views
12

Come posso dividere una stringa in una matrice nello script di shell?Dividi la stringa nell'array Shellscript

Ho provato con IFS='delimiter' e funziona con i loop (for, while) ma ho bisogno di un array da quella stringa.

Come posso creare un array da una stringa?

Grazie!

risposta

14
str=a:b:c:d:e 
IFS=: 
ary=($str) 
for key in "${!ary[@]}"; do echo "$key ${ary[$key]}"; done 

uscite

0 a 
1 b 
2 c 
3 d 
4 e 

Un'altra tecnica (bash):

str=a:b:c:d:e 
IFS=: read -ra ary <<<"$str" 

Questo limita la modifica alla variabile IFS solo per la durata del comando di lettura.

+1

Non funziona. Il messaggio di errore dice "(" nella riga dove è ary = ($ str). –

+1

Questa è in particolare la sintassi di bash. Che shell stai usando? Se lo script ha '#!/Bin/sh' cambia in' #!/bin/bash' –

+0

Ho cambiato, ma il messaggio di errore non è trascorso –

6

trovata una soluzione che non richiede la modifica della IFS o un ciclo:

str=a:b:c:d:e 
arr=(`echo $str | cut -d ":" --output-delimiter=" " -f 1-`) 

uscita:

echo ${arr[@]} 
a b c d e 
+1

questo non funziona ... prova a fare un eco $ {arr [1]} – mhstnsc

15
#!/bin/bash 

str=a:b:c:d:e 
arr=(${str//:/ }) 

OUTPUT:

echo ${arr[@]} 
a b c d e 
0

Combinando le risposte sopra in qualcosa che ha funzionato f o mi

set -- `echo $PATH|cut -d':' --output-delimiter=" " -f 1-`; for i in "[email protected]"; do echo $i; done 

# set -- `echo $PATH|cut -d':' --output-delimiter=" " -f 1-`; for i in "[email protected]"; do echo $i; done 
/usr/local/sbin 
/usr/local/bin 
/usr/sbin 
/usr/bin 
/sbin 
/bin 
# 
+0

Usare $ PATH per una stringa di test è un bel tocco, ma: troppo complicato, e in che cosa differisce da, ad esempio, [zzk's rispondere] (https://stackoverflow.com/a/13784224/3789665)? – greybeard

+0

@greybeard tl; dr It does not :) - Ho trovato che la risposta di zzk non ha funzionato abbastanza per me, quindi l'ho regolata con il 'set --' e poi ho raccolto elementi utili dalle risposte multiple date. Questo era per i miei scopi, ma anche condividere se altri avevano lo stesso problema –

+0

FWIW Avevo bisogno di eseguire più test contro tutte le cartelle elencate nel percorso - principalmente per l'auditing contro i problemi di escalation dei privilegi. –

Problemi correlati