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)fooy 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[@]}"llamafcon dos argumentos,xy'y z'. Las consultas de metadatos tienen gusto"${!foo[@]}"y"${#foo[@]}"actúan de manera similarfoocomo 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 decmd1ycmd2línea por línea.Tunning
Esto podría ajustarse mediante el
-dinterruptor: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
pastese fusionará línea por línea, por lo que la salida se volverá incorrecta:Para este trabajo, puede usar en
%qlugar del%ssegundoprintfcomando (y comillas):Se hará perfecto:
De
man bash:fuente
printf "%q\n" "${var[@]}"positivo para nueva línea fue mi problema!