對雙引號感到困惑
我在使用命令時了解到,雙引號將除 $、`、\ 之外的所有內容都視為字元。
但是,當使用命令 like
find -type f -name "*.jpg"
*.jpg
在雙引號內時。然後,這意味著我們想要將*
和.
視為一個角色。因此,該find
命令應該輸出具有名稱*.jpg
的正常文件,而不是實現路徑名擴展。如果我們想做路徑名擴展,我想我必須做 type 命令
find -type f -name *.jpg
(不帶雙引號)。但是,結果是一樣的。為什麼在此命令中使用雙引號?
萬用字元擴展的工作方式有一個微妙之處。切換到不包含 .jpg 文件的目錄並鍵入
echo *.jpg
它會輸出
*.jpg
特別是,字元串 *.jpg 保持不變。但是,如果您切換到包含 .jpg 文件的目錄,例如假設我們有兩個文件:image1.jpg 和 image2.jpg,那麼 echo *.jpg 命令將不會輸出
image1.jpg image2.jpg
並且 *.jpg 得到擴展。
如果你輸入
find . -name *.jpg
並且當您鍵入此內容時,您所在的目錄中沒有 .jpg 文件,然後 find 將收到參數“.”、“-name”和“*.jpg”。但是,如果您在包含 .jpg 文件的目錄中鍵入此命令,例如 image1.jpg 和 image2.jpg,那麼 find 將收到參數“.”、“-name”、“image1.jpg”和“image2.jpg” “,所以實際上會執行命令
find . -name image1.jpg image2.jpg
並找到會抱怨。如果您省略引號,真正令人困惑的是是否存在單個 .jpg 文件(例如 image1.jpg)。那麼萬用字元擴展將導致
find . -name image1.jpg
並且 find 命令會查找所有 basename 為 image1.jpg 的文件。
另外:這確實導致了一個有用的 bash 習慣用法,用於查看是否有任何文件與給定模式匹配:
if [ "$(echo *.jpg)" = "*.jpg" ]; then # *.jpg has no matches else # *.jpg has matches fi
但請注意,如果目前目錄中有一個名為 ‘*.jpg’ 的文件,這將不起作用。為了更加防水,你可以做
if [ "$(echo *.jpg)" = "*.jpg" ] && [ ! -e "*.jpg" ]; then # *.jpg has no matches else # *.jpg has matches fi
(雖然與問題沒有直接關係,但我添加了這個,因為它說明了萬用字元擴展如何工作的一些方面。)