프로세스 대체에 대한 올바른 표기 는 다음과 같습니다.
while read i; do echo $i; done < <(echo "$FILECONTENT")
i
루프 에 할당 된 마지막 값은 루프가 종료 될 때 사용할 수 있습니다. 대안은 다음과 같습니다.
echo $FILECONTENT |
{
while read i; do echo $i; done
...do other things using $i here...
}
중괄호는 I / O 그룹화 작업이며 자체적으로 하위 쉘을 생성하지 않습니다. 이러한 맥락에서, 그들은 파이프 라인의 일부이며, 따라서 서브 쉘로 실행되지만,이 때문에이다 |
는 없습니다 { ... }
. 질문에서 이것을 언급합니다. AFAIK, 함수 내부에서 리턴 할 수 있습니다.
Bash는 또한 shopt
내장 기능을 제공 하며 여러 옵션 중 하나는 다음과 같습니다.
lastpipe
설정되고 작업 제어가 활성화되지 않은 경우 셸은 현재 셸 환경의 백그라운드에서 실행되지 않은 파이프 라인의 마지막 명령을 실행합니다.
따라서 스크립트에서 다음과 같은 것을 사용 sum
하면 루프 이후에 modfied를 사용할 수 있습니다.
FILECONTENT="12 Name
13 Number
14 Information"
shopt -s lastpipe
sum=0
echo "$FILECONTENT" |
while read number name; do ((sum+=$number)); done
echo $sum
명령 줄에서이 작업을 수행하면 일반적으로 '작업 제어가 활성화되지 않음'(즉, 명령 줄에서 작업 제어가 활성화 됨)이라는 오류가 발생합니다. 스크립트를 사용하지 않고 테스트하지 못했습니다.
또한 Gareth Rees 가 답변 에서 언급했듯이 때때로 here 문자열을 사용할 수 있습니다 .
while read i; do echo $i; done <<< "$FILECONTENT"
이것은 필요하지 않습니다 shopt
; 당신은 그것을 사용하여 프로세스를 저장할 수 있습니다.