중첩 된 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

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

다만 사용하여 단지 {}를 사용하여 VAR local.declareing 변수하게 눈치 declare도 만든다 그 지역
munish

1
@munish 아니요, { }충분하지 않습니다. 예, 선언하면 var 내부를 함수로 만듭니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.