如何在 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如果您想将所有文件与 form 的所有文件进行交叉比较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(根本没有)andj没有多大意义。
  • 实际逐行读取和处理文件:
    while IFS= read -r line; do
      printf '%s\n' "$line"
      some_other_command "$line"
    done < "${results[i]}"  # for example
    
    • 但为什么要这么做↑?如果你想比较文件,那就diff这么做吧。

相关内容