
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