shell
2013-02-21 2 views 0 likes 
0

가변 카운트의 마지막 증가 값을 얻으려고하지만 초기 값인 0을 인쇄 할 때마다 변수 카운트의 마지막 증가 값을 얻는 방법은 무엇입니까?어떻게 쉘 스크립트에서 마지막으로 증가 된 값을 얻을 수 있습니까?

count=0 

mysql -uroot -proot -Dproject_ivr_db -rN --execute "SELECT Department FROM 
entrytests_datetime WHERE Discipline='msc'" | while read department 
do 

    echo "V,department_$count=$department" 
    let "count++" 
done 

echo "V,count=$count" 

echo "E,resume" 
+0

최신 버전의 bash (4.2 이상)에서는 스크립트의 시작 부분에'shopt -s lastpipe'를 추가하여 해답에 설명 된 문제를 해결할 수 있습니다. – chepner

답변

2

루프가 하위 쉘을 생성하고 하위 프로세스가 부모 환경을 변경할 수 없기 때문에 piped while 문이 있기 때문입니다. 대신 다음을 시도하십시오.

#!/usr/bin/bash 

count=0 

while read department 
do 
    echo "V,department_$count=$department" 
    let "count++" 
done < <(mysql -uroot -proot -Dproject_ivr_db -rN --execute \ 
     "SELECT Department FROM entrytests_datetime WHERE Discipline='msc'") 

echo "V,count=$count" 

echo "E,resume" 

나는 이것이 Posix를 준수하지 않는다고 말하고 싶습니다. bash에 set -o posix을 설정하고 오류를 확인하여 테스트하십시오.

+0

아니요, 저는 아닙니다 *. POSIX 이외의 확장을 사용한다고 말해야합니다. 모든 쉘에있는 것은 아닙니다. –

0

문제는 루프가 하위 셸에서 실행되고 값이 상위 셸에 전파되지 않는다는 것입니다. 파이프 라인의 명령이 있어야하기 때문에 서브 셸에서 실행됩니다. 주요 쉘

첫 번째 옵션은 POSIX 쉘 구조를 사용하여 쉽게에서 루프 실행을 확인

  1. 인쇄 값 서브 쉘
  2. 내부 : 당신은 두 가지 옵션이 있습니다. 간단히 중괄호로 최종 에코와 루프를 포장 : 스크립트가 끝날 것으로 보인다

    count=0 
    mysql -uroot -proot -Dproject_ivr_db -rN --execute "SELECT Department FROM 
        entrytests_datetime WHERE Discipline='msc'" | { 
        while read department; do 
         echo "V,department_$count=$department" 
         let "count++" 
        done 
        echo "V,count=$count" 
        echo "E,resume" 
    } 
    

    때문에,이 실용적이어야한다. 두 번째 옵션의 경우에만 프로세스 대체 확장자을 지원하는 셸에서 볼 수 있습니다. 배쉬 :

    count=0 
    while read department; do 
        echo "V,department_$count=$department" 
        let "count++" 
    done < <(mysql -uroot -proot -Dproject_ivr_db -rN --execute "SELECT Department 
        FROM entrytests_datetime WHERE Discipline='msc'") 
    echo "V,count=$count" 
    echo "E,resume" 
    

    내가 bash는 에 대한 서면 스크립트를 추천 할 것입니다; 많은 시스템은 이제 성능상의 이유로보다 간단한 쉘을 /bin/sh으로 사용하며이 쉘은 종종 프로세스 대체 확장을 지원하지 않습니다.

관련 문제