Bash

ls的for循環解析和背後的魔力*

  • July 30, 2022

我知道以下是不好的:

for i in `ls -1 *.MOV` ;do ...

並且正確的語法是

for i in  *.MOV ;do ...

但它背後的機制是什麼?我的意思是,哪一部分*.MOV告訴 for 命令我在談論文件名?程式碼中是否有假設for“沒有其他參數,假設文件名”?

而且……如果ls輸出在for內部不好,那麼要做什麼才能獲得它不會阻塞的可用文件名列表?

是的:-) shell 將萬用字元擴展為與萬用字元表達式匹配的文件集,在您的範例中為目前目錄中的 MOV 文件。但在此發生之前,必須考慮其他六種擴展。

手冊中詳細描述了“擴展” man bash

擴張

將其拆分為單詞後在命令行上執行擴展。執行的擴展有七種:大括號擴展、波浪號擴展、參數和變數擴展、命令替換、算術擴展、分詞和路徑名擴展。

路徑名擴展

分詞後,除非設置了 -f 選項,否則 bash 會在每個單詞中掃描字元 *、? 和 [。如果出現這些字元之一,則該單詞被視為一個模式,並替換為按字母順序排列的與該模式匹配的文件名列表(請參閱下面的模式匹配)。如果沒有找到匹配的文件名,並且 shell 選項 nullglob 未啟用,則單詞保持不變。

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