Linux 双for循环与bash编程
我想用bash编程做一些类似的事情Linux 双for循环与bash编程,linux,bash,ubuntu,Linux,Bash,Ubuntu,我想用bash编程做一些类似的事情 for file_x in file1, file2, file3, etc... for file_y in file1, file2, file3, etc... if file_y != file_x do something 有什么建议吗 如果要进行NxN比较,只对内部循环中列表的尾部进行操作是有意义的。差不多 #!/bin/bash for file_x in "file1" "file2" "file3" do
for file_x in file1, file2, file3, etc...
for file_y in file1, file2, file3, etc...
if file_y != file_x
do something
有什么建议吗 如果要进行NxN比较,只对内部循环中列表的尾部进行操作是有意义的。差不多
#!/bin/bash
for file_x in "file1" "file2" "file3"
do
for file_y in "file1" "file2" "file3"
do
if cmp -q "$file_y" "$file_x"
then
echo "$file_y $file_x are equal"
else
echo "$file_y $file_x are not equal"
fi
done
done
#!/bin/bash
files=(foo bar baz quux)
for ((i=0; i<${#files[@]}-1; i++)); do
for ((j=i+1; j<${#files[@]}; j++)); do
maybe=""
cmp -s "${files[$i]}" "${files[$j]}" || maybe=" not"
echo "${files[$i]} and ${files[$j]} are$maybe equal"
done
done
你需要什么样的提示?您的代码几乎完全正确;你只需要添加;dos到您的行的末尾,a;然后在if结束时,去掉do before某物…如果在shell中运行help for和help if来查看每一个的语法,并遵循该语法,那么嵌套循环或条件语句就没有什么特别的了;如果不是嵌套的话,它的语法是100%完全相同的。问题是file1、file2等是相同的吗?将它们隐藏在一个数组中:files=file1 file2 file3;对于${files[@]}中的文件_x;${files[@]}中的文件y的do;但无论如何,所有这些都将在语言介绍中介绍。StackOverflow是一个当你陷入困境时可以去的地方——当你还没有尝试过任何参考资料时,它不是第一个可以去的地方。我建议在您第一次阅读了一些文档,对语法有了一个基于非猜测的想法之后,再看看更自动化的kibiting。如果你有一些你认为应该根据文档和shellcheck工作的东西,请回到这里。需要更多的报价。此外,在我看来,对名称进行比较实际上是出于用户的意图,以避免在两个列表中都存在相同的目录条目时对其自身进行操作,而不是基于内容的比较……但无论如何,如果file1实际上是hello world.txt,那么cmp$file_y。。。不会把它当作一个单独的参数,而是把它分解成hello和Word…txt……并且如果你要使用CMP,考虑CMP -Q——这样它就不会向STDUT发出任何结果,并且一旦找到第一个不相等的字节,它就会退出,而不是继续比较它已经知道的两个不匹配的文件。如果文件大小不同,cmp-q可以在不需要读取内容的情况下确定文件不匹配,而cmp仍然需要通读,直到找到一个或另一个的结尾…是的,作为一个C开发人员,我强烈喜欢一种垂直空间保守的样式,在给定时间内最大化查看的代码量。。。因此,偏好至少是一致的。无论如何,因为这已经归结为一个骑自行车的问题,我很高兴收回我对这个话题的评论。这是一个诚实的回答,所以不应该被标记为不是一个答案。如果你不喜欢这个答案,你应该投反对票,而不是打旗子。