2014-01-29 4 views
3

환경 변경이 루프의 다른 반복에 영향을 미치지 않도록 서브 쉘을 사용하고 싶지만 서브 쉘 내부에 루프 제어문 (break, continue)을 사용할 수 있는지 확실하지 않습니다.서브 쉘 내에서 루프 제어

#!/bin/sh 
export A=0 
for i in 1 2 3; do 
    (
    export A=$i 
    if [ $i -eq 2 ]; then continue ; fi 
    echo $i 
) 
done 
echo $A 

루프 외부의 A 값은 내부에서 발생하는 어떤 영향도받지 않으며 정상입니다. 하지만 서브 쉘에 continue을 사용할 수 있습니까? 아니면 외부로 옮겨야합니까? 기록을 위해, 그것은 쓰여진대로 작동하지만, 아마도 그것은 신뢰할 수없는 부작용입니다.

+1

재미 있습니다. 서브 쉘은 별도의 프로세스이기 때문에 (자신의'$ BASHPID'를 가짐) 보통의 에러를 던질 것으로 기대한다 :'continue : 'for', 'while'또는 'until'loop'에서만 의미가있다. – grebneke

+0

실제 서브 쉘은 현실에 좀 더 관여하는 어떤 것을하지만 서브 쉘의'수출 '은 전혀 무의미하다. – tripleee

답변

2

그냥 작동하지 않는 확인하기 위해 닫는 괄호 후

echo "out $i" 

를 추가 -이 서브 쉘을 종료하지만, 루프를 계속한다. 하지만

다음 작품 :

#! /bin/bash 
export A=0 
for i in 1 2 3; do 
    (
     export A=$i 
     if [ $i -eq 2 ]; then exit 1 ; fi 
     echo $i 
    ) && echo $i out  # Only if the condition was not true. 
done 
echo $A 
+1

그러나 bash가 오류를 발생시키지 않는 이유는 설명하지 않습니까? 이것을 시도하면 오류가 발생합니다 :'(if [1! = 2]; then continue; fi)'. 하위 쉘이 루프에서 생성 될 때 OP와 동일한 문제가 발생하지 않는 이유는 무엇입니까? – grebneke

+1

이 설명은 나를 도왔습니다. http://lists.gnu.org/archive/html/help-bash/2012-10/msg00023.html – grebneke

+0

@ 그레브네크 그래서 올바르게 이해하면 '끊고'계속됩니다. 루프가 포함 된 서브 쉘은 단순히 서브 쉘에서 빠져 나가기 만하지만 루프에는 영향을 미치지 않습니다. 루프의 서브 쉘 이후에 아무 것도 없다면 (예에서와 같이) 효과는'continue'와 같습니다. – Jellby

0

는 단순히 서브 쉘에서 전체 루프를 포장 할 수 있습니까?

#!/bin/sh 
export A; 
A=0 
(
    for i in 1 2 3; do 
     A=$i 
     if [ $i -eq 2 ]; then continue ; fi 
     echo $i 
    done 
) 
echo $A 

참고 또한이 export 당신이 변수에 할당 할 때마다 사용할 필요가 없습니다. export은 값을 내 보내지 않습니다. 새로운 프로세스가 생성 될 때마다 그 변수의 현재 값이 새 프로세스의 환경에 추가 될 수 있도록 내 보낸 변수를 표시합니다.

+0

내 실제 사례가 아니기 때문에 다음에 영향을 미치지 않는 한 번의 반복이 필요합니다. 그리고 어떤 변수가 익스포트 될지 미리 알지 못합니다. 그것은 반복 특정 파일의 내용에 달려 있습니다. – Jellby