Ist es möglich, die Variable innerhalb der for-Schleife lokal zu verschachteln?

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

Raus :

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

Ist es möglich, die Variable innerhalb der for-Schleife lokal zu verschachteln?

Munish
quelle

Antworten:

9

Wenn Sie die innere Variable in einer Sub-Shell ausführen, hat dies keine Auswirkungen auf die äußere Variable:

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

Was dazu führt:

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
quelle
Dies ist gültig, aber bitte nicht. Es macht es viel schwieriger, dies auf einen Blick zu lesen.
Coteyr
1
Wenn Subshells zu häufig missbraucht werden, kann ein Skript spürbar langsamer werden.
user23013
2
Es ist jedoch schwieriger, nur den Leuten vorzulesen, die keine Unterschalen missbrauchen.
user23013
8

Ist es möglich, die Variable innerhalb der for-Schleife lokal zu verschachteln?

Ja, aber nur mit einer Funktion.

Da das integrierte Element localnur innerhalb einer Funktion vorhanden sein kann, müssen wir eine Funktion bereitstellen, mit der die Variable iden Gültigkeitsbereich von global in lokal ändert:

#!/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

quelle
1
Auch gültig und viel einfacher zu lesen.
Coteyr
Ich habe gerade bemerkt, dass die Verwendung von nur {} die Variablen local.declareing der var using declaremacht sie auch lokal
munish
1
@ Munish Nein, nur { }ist nicht genug. Ja, deklarieren macht eine var local innerhalb einer Funktion .