Bashスクリプトで2つのテキストファイルの配列を比較するには?

Bashスクリプトで2つのテキストファイルの配列を比較するには?

2つのテキストファイルの配列を比較しようとしています。このエラーは引き続き発生します。

./CompareScript.sh: line 11: read: `../Results/result1.txt[@]': not a valid identifier

これを正しく行う方法がわかりません。

#!/bin/bash
results=(../Results/*.txt)
correct=(../Correct/*.txt)
j=0
for i in "$results"
do
   while read -r $results[$j]; do
     while read  -r $correct[$j];do
        if [$results[$j]==$correct[$j]] ;  then
          echo "two files are same"
        else
          echo "two files content different"
        fi
     done
   done
   let "j += 1"
done

ベストアンサー1

何を達成したいのか明確ではありません。ディレクトリResultsCorrect一致するファイル名が含まれている場合は、そのいずれかを繰り返して別のパスを作成できます。

#!/bin/bash
results=(../Results/*.txt)

for r in "${results[@]}"; do
  diff -sq "$r" "${r/\/Results\//\/Correct\/}"
done

Resultsすべてのファイルをフォーム内のすべてのファイルと交差比較したい場合は、入れ子になったCorrectループの場合です。

#!/bin/bash
results=(../Results/*.txt)
correct=(../Correct/*.txt)

for r in "${results[@]}"; do
  for c in "${correct[@]}"; do
    diff -sq "$r" "$c"
  done
done

かなり明らかな構文エラー:

  • for i in "$results"
    for i in "${results[@]}"繰り返し値
    for i in "${!results[@]}"繰り返し指数
  • $results[$j]"${results[j]}"
  • [$results[$j]==$correct[$j]][[ "${results[j]}" == "${correct[j]}" ]]
  • 正確にはバグではありませんが… let "j += 1"((++j))
    - もっと重要なのはi(全くではない)使っていて、jあまり意味がないということです。
  • 実際にファイルを 1 行ずつ読み取って処理するには、次のようにします。
    while IFS= read -r line; do
      printf '%s\n' "$line"
      some_other_command "$line"
    done < "${results[i]}"  # for example
    
    • しかし、なぜこれを行うのですか?ファイルを比較したい場合は、diffそうしてください。

おすすめ記事