En un bucle sobre una matriz, agregue un elemento a la matriz

9

Tengo un problema con for loop en bash. Por ejemplo: tengo una matriz ("etc" "bin" "var"). E itero en esta matriz. Pero en el ciclo me gustaría agregar algún valor a la matriz. P.ej

array=("etc" "bin" "var")
for i in "${array[@]}"
do
echo $i
done

Esto se muestra etc bin var(por supuesto, en líneas separadas). Y si agrego después doasí:

array=("etc" "bin" "var")
for i in "${array[@]}"
do
array+=("sbin")
echo $i
done

Quiero: etc bin var sbin(por supuesto, en líneas separadas).

Esto no está funcionando. ¿Cómo puedo hacerlo?

damekr
fuente
1
Alterar lo que está iterando siempre es una propuesta arriesgada. A menudo es un buen momento para dar un paso atrás y considerar si hay otro enfoque que tenga sentido
Eric Renouf

Respuestas:

6

Se va a añadir "sbin" 3 veces como debe ser, pero no va a iterar sobre el recién agregado "sbin" s en el mismo bucle.

Después del segundo ejemplo:

echo "${array[@]}"
#=> etc bin var sbin sbin sbin
PSkocik
fuente
Sí, es cierto, pero necesito agregar al mismo bucle :)
damekr
Usa dos forbucles entonces. Primero realice sus adiciones, luego repita el resultado.
PSkocik
1
Sin embargo, no veo por qué querrías agregar sbin en el bucle. Agregarlo solo una vez tiene más sentido:array+=(sbin); for i in ...
PSkocik
lástima pues en bucle for debo comprobar si algún archivo que está copiando este bucle tiene algún contenido ..
damekr
5
set etc bin var
while [ "$#" -gt 1 ]
do    [ "$1" = bin ] &&
      set "$@" sbin
      printf %s\\n "$1"
shift;done 

Eso iterará sobre su lista, agregará sbinal final de dicha lista condicionalmente e incluirá sbinen el contenido iterable.

mikeserv
fuente