2013-01-14 1 views
1

나는 이것이 단순해야한다는 것을 알고 있지만, 나는 그것을 보지 않고 있습니다. 우리는 데이터베이스에 스피커의 일련의 단일 라인을 포함하는 SpeakerList.txt 파일을 가지고 있습니다. new.trs에는 공백으로 구분 된 데이터베이스 버전이 있습니다. 데이터베이스에서 연사를 찾았는지 확인해야하므로 스피커 이름으로 시작하는 줄에 grep을 실행하고 있습니다. 다음 코드는 모든 스피커에 대해 항상 if 문을 트리거합니다. 나는 파일 존재를 확인하는 코드와 비슷한 코드를 가지고 있으며 잘 작동한다. 내가 뭘 놓치고 있니? 나는 내 grep 루프가 실행 중임을 알고 있습니다 - 디버그로 시도했습니다. echo 라인. 나는 또한 $speakerFound 필드를 인쇄 해보고, "찾았습니다"라고 표시된 진술서가있을 때에도 실제로 마지막에 아무 것도 표시되지 않았 음을 확인했습니다.Bash - 플래그가 파일의 증거를 찾지 못하도록 설정되어 있지 않습니다.

for i in `cat SpeakerList.txt` 
do 
    speakerFound="" 
    echo "Speaker: $i" 
    grep "^$i" ~/work/new.trs | while read line 
    do 
    fileName=`echo $line | cut -d' ' -f 2` 
    speakerFound="found" 
    break 
    done 

    if [ "$speakerFound" == "" ]; then 
    echo "$i not found in database." 
    fi 
done 

답변

3

서브 쉘에 speakerFound 변수를 설정 중입니다. 자세한 내용은 this link, 그러나 일반적으로 읽기 :

  • 당신이 떠들썩한 파티에서 루프의 stdin 리디렉션 할 때, 루프는 서브 쉘에서 실행됩니다.
  • 루프가 서브 쉘이기 때문에 루프 내부의 변수 할당이 루프 바깥에서 보이지 않습니다.

한 가지 해결책은 디스크에 파일을 사용하여 결과를 포함하는 것입니다 (내부 루프에 쓰고 결과가 필요할 때 다시 읽음).

+0

또는 수표를 함수로 이동하고'return'을 사용하여 종료 코드를 설정 한 다음 확인할 수 있습니다. –

+0

나는 OP가 결과 코드 이상을 필요로한다고 가정하고 있지만, 그렇다면 체크를 함수로 옮길 필요가 없다. 명시 적으로 루프를 서브 쉘 ('(...) '을 통해)에서 실행할 수 있으며'exit '을 호출하면됩니다. – larsks

+0

실제로 그렇게했습니다. 발견 된 스피커에 대한 더미 파일을 만들고 제거하도록 코드를 변경했습니다. 나는 grep 출력을보고있는'while' 루프 안에 있었기 때문에 다른 하나가 작동했다고 생각합니다. 고맙습니다. –

관련 문제