중첩 루프를 사용하여 파일을 읽고 비교하는 데 문제가 있습니다.

중첩 루프를 사용하여 파일을 읽고 비교하는 데 문제가 있습니다.
while read newfile <&3; do   
 if [[ ! $newfile =~ [^[:space:]] ]] ; then  #empty line exception
    continue
 fi   
 #
 while read oldfile <&3; do   
 if [[ ! $oldfile =~ [^[:space:]] ]] ; then  #empty line exception
    continue
 fi   
    echo Comparing "$newfile" with "$oldfile"
    #
    if diff "$newfile" "$oldfile" >/dev/null ; then
      echo The files compared are the same. No changes were made.
    else
        echo The files compared are different.
    fi    
 done 3</infanass/dev/admin/oldfiles.txt
done 3</infanass/dev/admin/newfiles.txt

나는 이것이 중첩 루프를 수행하는 올바른 방법이라고 생각합니다. 그러나 그것은 제대로 작동하지 않습니다.

답변1

그런 식으로 파일 설명자 3을 사용할 필요는 없습니다.

while read newfile do   
    if [[ ! $newfile =~ [^[:space:]] ]] ; then  #empty line exception
       continue
    fi   

    while read oldfile ; do   
       if [[ ! $oldfile =~ [^[:space:]] ]] ; then  #empty line exception
          continue
       fi   
       echo Comparing "$newfile" with "$oldfile"

       # diff -q doesn't bother generating a diff.
       # It just tells you whether or not the files match.
       if diff -q "$newfile" "$oldfile" >/dev/null ; then
         echo The files compared are the same. No changes were made.
       else
           echo The files compared are different.
       fi    
    done < /infanass/dev/admin/oldfiles.txt
done < /infanass/dev/admin/newfiles.txt

빈 줄이 공백만 포함된 줄이라고 가정하면, 빈 줄 예외 코드는 비어 있지 않은 줄과 일치할 수 있습니다. 이는 공백만 포함된 줄과 일치합니다( \s*완전히 빈 줄만 일치하도록 제거됨).

if [[ ! $newfile =~ ^\s*$ ]] ; then  #empty line exception

관련 정보