Bash 스크립트에서 두 개의 텍스트 파일 배열을 비교하는 방법은 무엇입니까?

Bash 스크립트에서 두 개의 텍스트 파일 배열을 비교하는 방법은 무엇입니까?

두 개의 텍스트 파일 배열을 비교하려고 합니다. 이 오류가 계속 발생합니다.

./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별 의미가 없다는 것입니다.
  • 실제로 파일을 한 줄씩 읽고 처리하려면 다음을 수행하십시오.
    while IFS= read -r line; do
      printf '%s\n' "$line"
      some_other_command "$line"
    done < "${results[i]}"  # for example
    
    • 그런데 왜 이러는 걸까요? 파일을 비교하고 싶다면 diff그렇게 하세요.

관련 정보