2012-04-12 14 views
12

¿Cómo puedo dividir una cadena en una matriz en una secuencia de comandos de shell?Separar cadena en la matriz Shellscript

Intenté con IFS='delimiter' y funciona con los bucles (for, while) pero necesito una matriz de esa cadena.

¿Cómo puedo hacer una matriz a partir de una cadena?

Gracias!

Respuesta

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

salidas

0 a 
1 b 
2 c 
3 d 
4 e 

Otra técnica (bash):

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

Esto limita el cambio en la variable IFS sólo durante la duración del comando de lectura.

+1

No funciona. El mensaje de error dice "esperado" ("en la línea donde está ary = ($ str). –

+1

Esto es específicamente sintaxis bash. ¿Qué shell está usando? Si su script tiene' #!/Bin/sh' ¡cambie a '#!/bin/bash' –

+0

Cambié esto, pero el mensaje de error no aparece. –

6

encontrado una solución que no requiere el cambio de la IFS o un bucle:

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

salida:

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

esto no funciona ... intente hacer un eco $ {arr [1]} – mhstnsc

15
#!/bin/bash 

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

SALIDA:

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

La combinación de las respuestas arriba en algo que funcionó f o yo

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

da

# 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

Usar $ PATH para una cadena de prueba es un buen toque, pero: demasiado complicado, y ¿cómo difiere esto de, por ejemplo, [zzk's respuesta] (https://stackoverflow.com/a/13784224/3789665)? – greybeard

+0

@greybeard tl; dr No :): encontré que la respuesta de zzk no funcionó para mí, así que la ajustó por 'set --' y luego recopilé cosas útiles de las múltiples respuestas dadas. Esto fue para mis propios fines, pero también para compartir si otros tuvieran el mismo problema. –

+0

FWIW Necesitaba ejecutar múltiples pruebas contra todas las carpetas enumeradas en la ruta, principalmente para auditar contra problemas de escalamiento de privilegios. –

Cuestiones relacionadas