我正在尝试比较两个文本文件数组。我不断收到此错误
./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
如果您想将所有文件与 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
这么做吧。
- 但为什么要这么做↑?如果你想比较文件,那就