ネストされたforループ内の変数をローカルにすることは可能ですか?


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

アウトアウト:

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

ネストされたforループ内の変数をローカルにすることは可能ですか?

回答:


9

内部変数をサブシェルで実行しても、外部変数には影響しません。

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

その結果:

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
これは有効ですが、無効にしてください。一目でこれを読むのははるかに難しくなります。
coteyr 2016年

1
サブシェルを乱用しすぎると、スクリプトが著しく遅くなる可能性があります。
user23013

2
しかし、サブシェルを乱用しない人だけに読むのは難しいです。
user23013

9

ネストされたforループ内の変数をローカルにすることは可能ですか?

はい、ただし関数のみを使用します。

組み込みlocal関数は関数内にのみ存在できるため、変数iにスコープをグローバルからローカルに変更させる関数を提供する必要があります。

#!/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
また、有効で、はるかに読みやすいです。
coteyr 2016年

ちょうど{}を使用すると、変数がdeclareローカルになることに
気づきました。var

1
@munishいいえ、{ }十分ではありません。はい、declareはvarを関数内でローカルにします
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.