for
列出目录中的文件时,循环在排序方面的默认行为是什么?
例如
for sqlfile in *.sql; do mysql -u root -p pass < sqlfile; done
这是否记录在某处?
答案1
根据man bash
“路径名扩展”部分:
如果出现这些字符之一,则该单词被视为一种模式,并替换为按字母顺序排序与模式匹配的文件名列表 [...]
此排序取决于 的值$LC_COLLATE
:
该变量确定对路径名扩展结果进行排序时使用的排序规则 [...]
从上面可以看出,这与循环无关for
。 Glob 可以有多种使用方式,并且它们的扩展总是经过排序的。
答案2
for
循环不排序,它们按照它们出现的顺序给出值:
$ for x in b a c ; do echo $x ; done
b
a
c
另一方面,Glob 确实按字母顺序排序,无论您是否在 a 中for
或其他任何地方使用它们:
$ touch b a c
$ echo *
a b c