【问题标题】:double for loop with bash programming带有 bash 编程的双 for 循环
【发布时间】:2014-12-09 11:03:41
【问题描述】:

我想用 bash 编程做这样的事情

for file_x in file1, file2, file3, etc...  
  for file_y in file1, file2, file3, etc...  
    if file_y != file_x
      do something 

任何提示如何去做?

【问题讨论】:

  • 您需要什么样的提示?您的代码几乎完全正确;您只需在for 行的末尾添加; dos,在if 的末尾添加; then,并在something 之前取出do
  • ...如果您在 shell 中运行 help forhelp if 以查看每个语法,并遵循该语法,那么嵌套循环或条件句实际上并没有什么特别之处;如果它们没有嵌套,它与您使用的语法 100% 完全相同。
  • file1, file2, etc的问题是一样的吗?将它们存储在一个数组中:files=( file1 file2 "file 3" ); for file_x in "${files[@]}"; do for file_y in "${files[@]}"; do ...
  • ...但是无论如何,所有这些都将在任何语言介绍中涵盖。当您遇到困难时,StackOverflow 是一个可以去的地方——当您还没有尝试任何参考资料时,它不是第一个求助的地方。我建议mywiki.wooledge.org/BashGuide
  • 请参阅shellcheck.net 了解更多自动化kibitzing,在您第一次阅读一些文档以了解基于非猜测的语法概念之后。如果你有一些你认为应该按照文档和 shellcheck 工作的东西,请回到这里。

标签: linux bash ubuntu


【解决方案1】:
#!/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

【讨论】:

  • 需要更多报价。此外,在我看来,对名称的比较实际上是出于用户意图(以避免在两个列表中都存在时针对自身操作相同的目录条目),而不是基于内容的比较。
  • ...但是无论如何,如果 file1 实际上是 "hello world.txt",那么 cmp $file_y ... 不会将其视为单个参数,而是会将其拆分为 helloworld.txt
  • ...如果您打算使用cmp,请考虑cmp -q——这样它就不会向标准输出发出任何结果,并且会退出一旦它找到第一个不相等的字节,而不是继续比较它已经知道不匹配的两个文件。 (如果文件大小不同,cmp -q 可以确定文件不匹配,而无需读取内容,而cmp 仍然需要通读,直到找到一个或另一个结尾)。
  • ...是的,作为 C 开发人员,我非常喜欢垂直空间保守的风格,在给定时间最大化查看代码量...所以偏好是,在最少的,一致的。无论如何,这已经归结为自行车脱落问题,我很高兴收回关于该主题的 cmets。
  • 这是对答案的诚实尝试,因此不应被标记为不是答案。如果你不喜欢这个答案,你应该投反对票,而不是标记它。
【解决方案2】:

如果您正在进行 NxN 比较,则只对内部循环中列表的尾部进行操作是有意义的。类似的东西

#!/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

【讨论】:

    猜你喜欢
    • 2015-12-23
    • 2012-04-04
    • 2023-03-11
    • 2014-01-20
    • 2020-04-19
    • 2013-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多