두 개의 텍스트 파일 배열을 비교하려고 합니다. 이 오류가 계속 발생합니다.
./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
무엇을 달성하고 싶은지 명확하지 않습니다. 디렉터리 Results
와 Correct
일치하는 파일 이름이 포함되어 있으면 그 중 하나를 반복하여 다른 경로를 생성할 수 있습니다.
#!/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
그렇게 하세요.
- 그런데 왜 이러는 걸까요? 파일을 비교하고 싶다면