2013-08-28 4 views
1

나는 큰 스크립트를 가지고 있지만이 작은 사람은 문제를 보여줍니다 변수가 while 루프 외부 설정이 변수가 변경되지 않는 이유는 무엇입니까?

#!/bin/bash 
x=0 
if [[ $x == 0 ]] 
then 
    ls | while read L 
    do 
    x=5 
    echo "this is a file $L and this is now set to five --> $x" 
    done 
fi 
echo "this should NOT be 0 --> $x" 

경우 내가 예상대로 다음 작동합니다. bash 버전은 3.2.25 (1) -release (x86_64-redhat-linux-gnu)입니다. 이것이 명백한 일이라면 나는 너무 바보 같은 기분이들 것이다.

+0

이것은 일반적인 질문입니다. 자주 묻는 질문 (FAQ) 읽기 : http://mywiki.wooledge.org/BashFAQ/024 –

+0

위대한 링크 : [ls의 출력을 구문 분석하지 않아야하는 이유] (http://mywiki.wooledge.org/ParsingLs) –

+0

비슷한 것을 확인하십시오 thread : http://stackoverflow.com/questions/13233452/bash-variable-change-doesnt-persist. – konsolebox

답변

3

x이 5로 설정되면 하위 셸에 포함되며 (파이프 라인의 일부이기 때문에) 하위 셸에서 발생하는 동작은 상위 셸에 영향을주지 않습니다.

이 당신은 결과를 서브 쉘을 방지하고 얻을 수

bash에서 공정 대체를 사용하여 예상 당신 :

#!/bin/bash 
x=0 
if [[ $x == 0 ]] 
then 
    while read L 
    do 
    x=5 
    echo "this is a file $L and this is now set to five --> $x" 
    done < <(ls) 
fi 
echo "this should NOT be 0 --> $x" 

이제 while 루프가 기본 쉘 프로세스의 일부입니다 (단지 ls은 하위에 -process) 변수 x이 영향을받습니다.

ls의 출력을 구문 분석 할 때마다 다른 시간을 논의 할 수 있습니다. 문제의 대부분은 부수적이다.

또 다른 옵션은 다음과 같습니다

#!/bin/bash 
x=0 
if [[ $x == 0 ]] 
then 
    ls | 
    { 
    while read L 
    do 
    x=5 
    echo "this is a file $L and this is now set to five --> $x" 
    done 
    echo "this should NOT be 0 --> $x" 
    } 
fi 
echo "this should be 0 still, though --> $x" 
+0

아야! 얼마나 당황 스럽습니까. Aleks-Daniel Jakimenko와 Jonathan Leffler에게 감사드립니다. – Allen

관련 문제