İç içe değişkenin döngü için iç içe yerleştirilmesi mümkün mü


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

dışarı dışarı :

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

İç içe değişkenin döngü için iç içe yerleştirilmesi mümkün mü?

Yanıtlar:


9

İç değişkeni bir alt kabukta çalıştırırsanız, dış değişkeni etkilemez:

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

Sonuç:

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

1
Bu geçerli, ama lütfen yapma. Bir bakışta okumayı çok daha zorlaştırıyor.
coteyr

1
Alt kabukları çok fazla kötüye kullanmak bir komut dosyasını belirgin şekilde yavaşlatabilir.
user23013

2
Ancak sadece alt kabukları kötüye kullanmayanlara okumak daha zordur.
user23013

9

İç içe değişkenin döngü için iç içe yerleştirilmesi mümkün mü?

Evet, ancak sadece bir işlev kullanıyor.

Yerleşik localyalnızca bir fonksiyonun içinde mevcut olabileceğinden, değişkenin ikapsamı globalden lokal olarak değiştirmesini sağlamak için bir fonksiyon sağlamalıyız :

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

1
Ayrıca geçerli ve okunması çok daha kolay.
coteyr

sadece {} kullanmanın değişkenleri declareyerel kıldığını fark ettim. var kullanarak bildirimi de yerel kılıyor
munish

1
@munish Hayır, sadece { }yeterli değil. Evet, declare bir local Inside işlevini yapar .
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.