Wildcards
echo 如何辨識,何時應該輸出文件列表或純文字?
我在測試中遇到了這個問題:Make echo 輸出所有以元音開頭的目錄(a,e,i,o,u,e),以數字結尾並且至少有 3 個字元。我認為這會相當容易,但很快我就感到困惑並最終未能通過測試。我的第一個想法很簡單:
echo {a,e,i,o,u,e}*{0..9}
然後我嘗試使用方括號
echo [a,e,i,o,u,e]*[0..9]
最後我嘗試了這樣的事情:
echo $(ls {a,e,i,o,u,e}*{0..9})
這給了我所需的輸出,但有一些錯誤目錄缺少消息,我什至不確定它是否不會被視為作弊,因為我使用另一個函式來做到這一點。
誰能為我澄清一下,我該怎麼做以及何時使用哪個括號?而且我還想知道,echo 如何辨識它何時應該輸出目錄列表而不是我的確切單詞。
為了用roaima 的澄清來擴展mosvy 的評論,我建議:
echo [aeiou]?*[0-9]/
這使用文件名擴展(萬用字元)功能來滿足您的要求:
- 目錄或指向目錄的符號連結(尾部斜杠
/
)- 以英文小寫元音 (
[aeiou]
)開頭- 至少包含一個附加字元 (
?
)- 並且至少有三個字元(
*
將匹配零個或多個字元,添加到我們已經匹配的兩個和我們最後匹配的一個,如下)- 以十進制數字結尾 (
[0-9]
)您的 shell 擴展任何匹配的目錄名稱並將它們傳遞給
echo
,它只是將它們回顯出來。但是請注意,對於某些 shell,包括
bash
,如果沒有符合要求的目錄,您的 shell 將不理會該模式並直接將echo
其傳遞給它將再次回顯它,從而產生以下輸出:$$ aeiou $$?*$$ 0-9 $$/
您可以通過設置“nullglob”選項在 bash 中稍微調整它,該選項告訴 bash 當沒有 (null) 匹配項 (globs) 時,刪除模式,在這種情況下不會將任何內容傳遞
echo
給列印一個空行。或者使用failglob
失敗 glob 的選項來觸發錯誤。