2012-11-30 5 views
0

커맨드 라인에서 여러 파일의 줄 수를 계속해서 쓰려고하는 유닉스 쉘 스크립트에 문제가 있습니다. 개별적으로 라인 수를 계산할 수 있으며 루프를 통해 실행될 때마다 표시하지만, 변수는 항상 끝에 0을 읽습니다. 당신이 서브 쉘에서 뭔가를 실행하면유닉스 쉘 스크립트에서 누적 합계

#! /bin/sh 
lines=0 

line_count(){ 
    #count the lines 
    l= blablabla..... 
    lines=`lines + l` 
} 

for f in "[email protected]" 
do 
echo "total lines:" 
(line_count "$f") 
done 
+0

'wc -l 파일'의 문제점은 무엇입니까? –

+0

여기에서 wc를 사용할 수 없습니다. –

+0

그냥'sh'를 원하거나'wc'에 접근 할 수 없어요,'grep -c '는 어떨까요? –

답변

2

, 당신은 (예를 들어, $lines 증가) 않은 모든 변수의 변화는 서브 쉘 내에서만 유효하며 때 서브 쉘 종료를 손실됩니다. 그러나 당신이 서브 쉘을 전혀 필요로하지 않는 함수를 사용하고 있기 때문에 함수를 호출하십시오.

또한 lines=`lines + l` 난 당신이 의도하지 생각 인수 +l와 명령 lines을 실행하려고합니다. 표현식의 결과를 평가하려면 $((...)) 구문을 사용하고 값 앞에 $을 앞에 붙이면됩니다.

마지막으로 $lines 값을 사용하지 마십시오. 함수를 호출 한 후에 인쇄 할 수 있습니다.

#! /bin/sh 
lines=0 

line_count(){ 
    #count the lines 
    l= blablabla..... 
    lines=$(($lines + $l)) 
} 

for f in "[email protected]" 
do 
    line_count "$f" 
    echo "total lines: $lines" 
done 
+0

누적 합계를 파일에 저장 한 다음 필요할 때 값을 가져 오는 것이 좋지 않습니까? 그 나쁜 연습인가? –

+0

@jimjohnjim, 그렇게 할 수는 있지만 특히 단일 숫자를 저장하는 곳의 경우와 같이 데이터를 메모리에 보관하는 것이 훨씬 효율적입니다. 보다 복잡한 작업을 위해서는 부분 결과를 나중에 사용하기 위해 파일에 쓰는 것이 필요하거나 도움이 될 수 있습니다. –