Quiero hacer algo como esto:
foo=( )
foo[0]="bar"
foo[35]="baz"
for((i=0;i<${#foo[@]};i++))
do
echo "$i: ${foo[$i]}"
done
# Output:
# 0: bar
# 1:
Luego intenté recorrerlo usando for in:
foo=( )
foo[0]="bar"
foo[35]="baz"
for i in ${foo[@]}
do
echo "?: $i"
done
# Output:
# ?: bar
# ?: naz
pero aquí no sé el valor del índice.
Sé que podrías hacer algo como
foo=( )
foo[0]="bar"
foo[35]="baz"
declare -p foo
# Output:
# declare -a foo='([0]="bar" [35]="baz")'
pero, ¿no puedes hacerlo de otra manera?
(a b c)
para convertirlo en una matriz.[@]
comillas dobles significa que no es una "lista de palabras separadas por espacios". Obtiene la lista de claves de matriz reales, incluso si las claves individuales contienen espacios en blanco.The use of [@] and double quotes means it's not a "space separated list of words"
"${foo[@]}"
toma la variable (matriz)foo
y la expande como una matriz, manteniendo la identidad de sus elementos, es decir, sin dividirlos en espacios en blanco. Sifoo=(x 'y z')
, entoncesf "${foo[@]}"
llamaf
con dos argumentos,x
y'y z'
. Las consultas de metadatos tienen gusto"${!foo[@]}"
y"${#foo[@]}"
actúan de manera similarfoo
como una matriz."${!foo[@]}"
es la lista de todos los índices establecidos en la matriz".siempre puedes usar el parámetro de iteración:
fuente
((ITER++))
en fiesta modernafuente
En bash 4, puede usar matrices asociativas:
En bash 3, esto funciona (también funciona en zsh):
fuente
fuente
Truco simple de una línea para volcar la matriz
He agregado un valor con espacios:
Yo, para volcar rápidamente intentomatrices o matrices asociativas que uso
Este comando de una línea:
Rendirá:
Explicado
printf "%s\n" "${!foo[@]}"
imprimirá todas las teclas separadas por una nueva línea ,printf "%s\n" "${foo[@]}"
imprimirá todos los valores separados por una nueva línea ,paste <(cmd1) <(cmd2)
fusionará la salida decmd1
ycmd2
línea por línea.Tunning
Esto podría ajustarse mediante el
-d
interruptor:o incluso:
La matriz asociativa funcionará igual:
Problema con líneas nuevas o caracteres especiales
Desafortunadamente, hay al menos una condición que hace que esto ya no funcione: cuando la variable contiene nueva línea:
El comando
paste
se fusionará línea por línea, por lo que la salida se volverá incorrecta:Para este trabajo, puede usar en
%q
lugar del%s
segundoprintf
comando (y comillas):Se hará perfecto:
De
man bash
:fuente
printf "%q\n" "${var[@]}"
positivo para nueva línea fue mi problema!