2013-08-16 4 views
0

여기에는 2 개의 코드가 있고 $1의 값은 3 행의 텍스트를 포함하는 파일의 이름입니다.루프의 변수에 값을 할당하십시오.

이제 문제가 있습니다. 첫 번째 코드에서는 루프에서 "올바른"값을 얻을 수 없지만 두 번째 코드에서는 올바른 결과를 얻을 수 있습니다. 나는 이유를 모른다.

코드의 첫 번째 부분을 올바른 결과로 만들려면 어떻게해야합니까?

#!/bin/bash 

count=0 
cat "$1" | while read line 
do 
    count=$[ $count + 1 ] 
done 
echo "$count line(s) in all." 

#----------------------------------------- 

count2=0 
for var in a b c 
do 
    count2=$[ $count2 + 1 ] 
done 
echo "$count2 line(s) in all." 
+1

그냥 = $를 계산'사용할 수 없습니다 어떤 이유 (화장실 -l $ 1)'? –

+0

나는 초보자입니다. bash를 사용하여 연습하고 싶습니다. @ 폴 에반스 –

답변

5

이것은 while 루프 이전의 파이프 때문에 발생합니다. 하위 쉘을 작성하므로 변수의 변경 사항이 주 스크립트로 전달되지 않습니다. 이 문제를 극복하기 위해, 대신 process substitution를 사용

while read -r line 
do 
    # do some stuff 
done < <(some commad) 

버전 4.2 이상, 당신은 또한 lastpipe 옵션을 설정할 수 있으며, 파이프 라인의 마지막 명령 은 현재 쉘이 아닌 서브 쉘에서 실행됩니다. 그냥 파일의 내용을 사용하고 있기 때문에, 당신이 입력 리디렉션 사용할 수 있습니다이 경우

shopt -s lastpipe 
some command | while read -r line; do 
    # do some stuff 
done 

:

while read -r line 
do 
    # do some stuff 
done < "$file" 
관련 문제