ネストされたループを使用してファイルを読み取って比較するのに問題があります。

ネストされたループを使用してファイルを読み取って比較するのに問題があります。
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

おすすめ記事