Bash

為什麼 echo 匹配某些文件兩次?

  • November 18, 2015
$ touch file{1..12}

$ echo *e{1..12}
file1 file2 file3 file4 file5 file6 file7 file8 file9 file10 file11 file12

$ echo *{1..12}
file1 file11 file12 file2 file3 file4 file5 file6 file7 file8 file9 file10 file11 file12

我不明白為什麼會這樣。請問有人可以解釋嗎?

大括號不是萬用字元模式。檢查bash 擴展的文件:大括號在此過程中很早就被擴展,萬用字元模式在最後一步中擴展¹。

最初,該命令由兩個單詞echo,組成*{1..12}。大括號展開後,命令包含 13 個單詞:echo, *1, *2, …, *12. 然後擴展萬用字元模式。*1擴展為以 結尾的文件名列表1,其中不僅包括,file1還包括file11(之後按字典順序排序)。同樣*2擴展到file12file2(按此順序)。所以你得到echo, file1, file11, file12, file2, 然後是匹配單個文件的其他萬用字元:file3, file4, …, file12.

¹倒數第二個,如果您按照手冊的描述進行操作,但“引號刪除”並不是真正的事情——引號在擴展過程之前被解析。

引用自:https://unix.stackexchange.com/questions/243737