【问题标题】:Is the order of iteration in bash for loop guaranteed? [duplicate]bash for 循环中的迭代顺序是否得到保证? [复制]
【发布时间】:2016-05-17 21:45:24
【问题描述】:

假设我在 bash 中有一个 for 循环,如下所示:

for i in $MYDIR/*.jar
do
    # do something with files
done

是否保证了迭代的顺序,即循环是否总是以相同的顺序处理文件?如果有保证,是按字母顺序排列的吗?

【问题讨论】:

  • 我相信这适用:serverfault.com/a/122743/1239
  • 顺便说一句,这通常不是关于 for 循环的问题,而是关于 glob 的问题。 for i in 9 5 3; do echo "$i"; done 将按此顺序运行。
  • 你问错问题了。这不是扩展您的 * 的循环。 Shell 将首先将您的 *.jar 扩展为文件列表,然后循环将遍历该文件列表。

标签: linux bash glob


【解决方案1】:

根据bash man page

路径名扩展

分词后,除非设置了 -f 选项,否则 bash 会扫描 字符 *、? 和 [ 的每个单词。如果这些字符之一 出现,则该词被视为一个模式,并替换为 与模式匹配的文件名按字母顺序排序的列表(请参阅 模式匹配如下)。

因此,由于通配扩展规则,文件将按字母顺序(取决于您的语言环境,请参阅 cmets)处理。

【讨论】:

  • 如果您的语言环境是 C,则只有 ASCII 顺序。“按字母顺序排序”并不普遍表示 ASCII。
  • ...例如,某些语言环境的排序规则为 AaBbCc...,而对于其他语言环境,则为 ABC...abc...
  • @CharlesDuffy 谢谢,我编辑了我的答案
猜你喜欢
  • 2011-01-04
  • 2015-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-25
  • 1970-01-01
  • 1970-01-01
  • 2018-03-01
相关资源
最近更新 更多