我在讀下面的教程擴展在Linux中
http://linuxcommand.org/lc3_lts0080.php
它說,關於雙引號:
雙引號
第一種類型的報價,我們將看看是雙引號。 如果您將文本置於雙引號內,則shell 使用的所有特殊字符將失去其特殊含義並被視爲普通字符。例外是「$」, 「\」(反斜槓)和「`」(反引號)。這意味着字分割,路徑名擴展,波形擴展和大括號擴展被抑制,但是仍然執行參數擴展, 算術擴展和命令替換。
而關於單引號:
單引號
如果需要抑制所有的擴展,可以使用單引號。
它說明,與ls
爲什麼只有*.txt
工作不"*.txt"
或'*.txt'
$ ls -l *.txt
-rw-r--r-- 1 Gaurav None 8893 Apr 17 06:25 BigText.txt
-rwxr-xr-x 1 Gaurav None 54376 Apr 18 12:32 File.txt
-rw-r--r-- 1 Gaurav None 371 Apr 23 21:04 Filelist.txt
-rwxr-xr-x 1 Gaurav None 54386 Apr 18 12:28 FileOld.txt
-rw-r--r-- 1 Gaurav None 1163 Apr 17 06:19 Read.txt
-rw-r--r-- 1 Gaurav None 651 Apr 24 06:28 temp.txt
$ ls -l "*.txt"
ls: cannot access *.txt: No such file or directory
$ ls -l '*.txt'
ls: cannot access *.txt: No such file or directory
我的問題是,隨着find or grep
爲什麼"*.txt", '*.txt'
都提供了擴展:(其實*.txt
沒有提供任何擴展爲名稱而不是ls
)
eg
$ find . -name *.txt
find: paths must precede expression: File.txt
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
$ find . -name "*.txt"
./BigText.txt
./File.txt
./Filelist.txt
./FileOld.txt
./Read.txt
./sample/BigText.txt
./sample/File.txt
./sample/FileOld.txt
./sample/Read.txt
./sample/temp.txt
./temp.txt
$ find . -name '*.txt'
./BigText.txt
./File.txt
./Filelist.txt
./FileOld.txt
./Read.txt
./sample/BigText.txt
./sample/File.txt
./sample/FileOld.txt
./sample/Read.txt
./sample/temp.txt
./temp.txt
根據您的輸出,擴展由shell正確處理。 '*'在雙引號內失去意義,因此當作爲參數傳遞給任何命令時,將不會被擴展。 'find'在'-name'之後需要'pattern',因此需要使用quote或shell會擴展表達式並導致語法錯誤。 – alvits