¿Es posible hacer que la variable dentro de anidada para el bucle local

9
#!/bin/bash
for i in  1 2 3 4
do

#   {
#   local i     ##gives error  local: can only be used in a function
    for i in 1 2 3
    do
    echo "inner loop ----- $i"
    (( i++ ))
    done
#   }
echo $i
done

fuera fuera :

inner loop ----- 1
inner loop ----- 2
inner loop ----- 3
4
inner loop ----- 1
inner loop ----- 2
inner loop ----- 3
4
inner loop ----- 1
inner loop ----- 2
inner loop ----- 3
4
inner loop ----- 1
inner loop ----- 2
inner loop ----- 3
4

¿Es posible hacer que la variable dentro de anidado para el bucle sea local?

munish
fuente

Respuestas:

9

Si ejecuta la variable interna en un shell secundario, no afectará a la variable externa:

for i in 1 2 3 4; do
    (
        for i in 1 2 3; do
            echo "inner loop ----- $i"
            (( i++ ))
        done
    )
    echo $i
done

Lo que resulta en:

inner loop ----- 1
inner loop ----- 2
inner loop ----- 3
1
inner loop ----- 1
inner loop ----- 2
inner loop ----- 3
2
inner loop ----- 1
inner loop ----- 2
inner loop ----- 3
3
inner loop ----- 1
inner loop ----- 2
inner loop ----- 3
4
joepd
fuente
1
Esto es válido, pero no lo hagas. Esto hace que sea mucho más difícil de leer de un vistazo.
coteyr
1
Abusar demasiado de las subcapas podría hacer que una secuencia de comandos sea notablemente más lenta.
user23013
2
Pero es más difícil de leer solo para aquellas personas que no abusan de las subcapas.
user23013
9

¿Es posible hacer que la variable dentro de anidado para el bucle sea local?

Sí, pero solo usando una función.

Como la localfunción integrada solo puede existir dentro de una función, debemos proporcionar una función para que la variable icambie el alcance de global a local:

#!/bin/bash

internalfunction () {
    local i     ### Works as is inside a function
    for i in 1 2 3; do
        echo "inner loop ----- $i"
        (( i++ ))
    done
}

for i in  1 2 3 4; do
    echo $i
    internalfunction
done

$ ./script.sh
1
inner loop ----- 1
inner loop ----- 2
inner loop ----- 3
2
inner loop ----- 1
inner loop ----- 2
inner loop ----- 3
3
inner loop ----- 1
inner loop ----- 2
inner loop ----- 3
4
inner loop ----- 1
inner loop ----- 2
inner loop ----- 3

fuente
1
También válido, y mucho más fácil de leer.
Coteyr
acabo de notar que usar solo {} hace que las variables sean declarelocales
Declarar
1
@munish No, solo { }no es suficiente. Sí, declare hace una var local dentro de una función .