Est-il possible de rendre la variable à l'intérieur imbriquée pour la boucle locale

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

dehors :

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

Est-il possible de rendre la variable à l'intérieur imbriquée pour la boucle locale.

munish
la source

Réponses:

9

Si vous exécutez la variable interne dans un sous-shell, cela n'affectera pas la variable externe:

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

Ce qui se traduit par:

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
la source
1
Ceci est valable, mais ne le faites pas. Cela rend la lecture d'un coup d'œil beaucoup plus difficile.
coteyr
1
Trop abuser des sous-coquilles pourrait ralentir sensiblement un script.
user23013
2
Mais il est plus difficile de lire uniquement aux personnes qui n'abusent pas des sous-coquilles.
user23013
9

Est-il possible de rendre la variable à l'intérieur imbriquée pour la boucle locale.

Oui, mais uniquement en utilisant une fonction.

Comme la fonction intégrée localne peut exister qu'à l'intérieur d'une fonction, nous devons fournir une fonction pour que la variable ichange la portée de global à 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

la source
1
Également valide et beaucoup plus facile à lire.
coteyr
vient de remarquer que l'utilisation de juste {} rend les variables local.declareing la var using declarerend également local
munish
1
@munish Non, ce { }n'est pas suffisant. Oui, declare rend un var local à l' intérieur d'une fonction .