es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Iterando un arreglo en una función declarada en un script de shell de Bash

He estado trabajando en la creación de un script para mover algunos archivos de una máquina local a un servidor remoto. Como parte de ese proceso, tengo una función que puede ser llamada directamente o envuelta con ‘declare -fp’ y enviada junto a un comando ssh. El código que tengo hasta ahora se ve así:

export REMOTE_HOST=myserver
export TMP=eyerep-files

doTest()
{
    echo "Probando mover archivos desde $TMP con argumento $1"
    declare -A archivos=("abc"="123" "xyz"="789")
    echo "Archivos: ${!archivos[@]}"
    for key in "${!archivos[@]}"
    do
        echo "$key => ${archivos[$key]}"
    done
}

moveTest()
{
    echo "intentando mover con función envuelta"
    ssh -t "$REMOTE_HOST" "$(declare -fp doTest|envsubst)"; doTest ${1@Q}
}

moveTest $2

Si ejecuto el script con algo como:

./myscript.sh test dev

Obtengo la salida:

intentando mover con función envuelta
Probando mover archivos desde eyerep-files con argumento dev
Archivos: abc xyz
bash: line 7:  => ${archivos[]}: sustitución incorrecta

Parece que la expansión de la cadena en el bucle for no está funcionando correctamente. ¿Se espera este comportamiento? Si es así, ¿hay alguna otra forma de iterar a través de un array que evite este problema?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema está en la forma en que el array se está expandiendo dentro del bucle for. La sintaxis utilizada para expandir la variable del array, “${!files[@]}”, debería funcionar correctamente, pero el mensaje de error sugiere que hay un índice vacío que se está utilizando en algún lugar. Podría ser útil probar una sintaxis diferente para el bucle, como “for key in ${!files[*]}”, para ver si eso resuelve el problema.

    Otra opción sería utilizar un método diferente para definir y recorrer el array, como usar “declare -p” para imprimir la definición del array y luego “eval” para recrearlo en el servidor remoto. Esto puede eliminar cualquier problema con la expansión de variables y permitir que el array se recorra correctamente.

    En general, parece que el problema probablemente esté en la forma en que se está expandiendo el array, y experimentar con diferentes sintaxis o métodos para definir y recorrer el array debería ayudar a resolver el problema.

Comments are closed.