Tengo una matriz dinámica con valores de par de claves y me gustaría enumerarlas.uno sí y otro novalor. En este caso, sólo los nombres de la matriz. Como no estoy usando bash v4, he podido seq
recorrer una matriz usando echo.
$ array=(Guido yes Francesca no Balthazar yes)
for x in $(seq 0 2 ${#array[@]});do echo $x;done
0
2
4
6
Esto devuelve un elemento más que los pares que tengo (debido al desplazamiento 0), pero puedo explicarlo usando matemáticas simples de bash:
for x in $(seq 0 2 $((${#array[@]}-1)));do echo $x;done
0
2
4
Esto funciona bien. Pero tan pronto como intento extraer elementos $array
, aparece un error que no puedo explicar. Lo he intentado con y sin las "matemáticas".
$ for x in $(seq 0 2 $((${#array[@]}-1)));do echo ${array[$x]};done
-bash: 0: syntax error: operand expected (error token is "0")
$ for x in $(seq 0 2 ${#array[@]});do echo ${array[$x]};done
-bash: 0: syntax error: operand expected (error token is "0")
¿Cómo puedo sacar sólo los nombres de esta matriz dinámica?
EDITAR:mi $BASH_VERSION
es 3.2.57(1)-release
(MacOS X 10.10.2)
EDITAR #2:He llegado a la conclusión de que posiblemente se trate de un error en esta versión. Como administro varias instancias de AWS, decidí verificarlas y todas tienen bash 4.1.2(1). Actualicé mi Mac a esta versión y ahora funciona. Gracias por mirar, pero lo atribuyo a una anomalía.
Respuesta1
Si desea recorrer elementos alternativos de la matriz, este debería funcionar en bash 3.2:
while IFS= read -d '' -r name; do
# do something with "$name"
done < <(printf %s%.0s\\0 "${array[@]}")
Podrías hacer cosas similares xargs -0
si fuera más conveniente.
Si ninguno de sus nombres incluye dos puntos (por ejemplo), puede extraer los nombres en una nueva matriz como esta:
IFS=: read -a names -r < <(printf %s%.0s: "${array[@]}")
(Desafortunadamente, no puede establecer el separador de campos en NUL).
Todo esto depende del hecho de que printf
repite su cadena de formato tantas veces como sea necesario para usar todos sus argumentos (comportamiento Posix, por lo que debería funcionar en cualquier versión de bash o con la versión no incorporada printf
). El formato ocasionalmente útil %.0s
utiliza un argumento e imprime como máximo 0 caracteres, es decir, lo coloca en el bitbucket.