2017-03-02 75 views
1

我試圖做一個小腳本圍繞這個命令的封裝:爲什麼bash腳本將單引號添加到帶有星號的字符串?

$ egrep target /usr/lusers/me/test/*test.txt 
/usr/lusers/me/test/1test.txt:target 

那個目錄下有文件名爲1test.txt2test.txt,其中一個包含一些文字,我想找到。
這裏是我的整個腳本,叫mygrep.sh

set -v 
set -x 
egrep "$1" '/usr/lusers/me/test/*test.txt' 

下面是輸出:

$ ./mygrep.sh target 
set -x 
egrep "$1" '/usr/lusers/me/test/*test.txt' 
++ egrep targ '/usr/lusers/me/test/*test.txt' 
egrep: /usr/lusers/me/test/*test.txt: No such file or directory 

注意' S周圍的set -x輸出的文件路徑,該命令將失敗。

現在比較腳本的這種變化:

set -v 
set -x 
egrep "$1" '/usr/lusers/me/test/1test.txt' 

注意,唯一的區別是星號VS文本文件名稱。
輸出:

$ ./mygrep.sh target 
set -x 
egrep "$1" '/usr/lusers/me/test/1test.txt' 
++ egrep target /usr/lusers/me/test/1test.txt 
target 

沒有單引號擴張後,和該命令的作品。

那麼爲什麼這些單引號添加了星號,以及爲什麼命令在這種情況下失敗?

回答

2

set -x產生的輸出用於調試目的。沒有引號被添加到參數中;它們僅用於顯示目的。

正確的命令是egrep "$1" /usr/lusers/me/test/*.test.txt,因爲在將結果傳遞到egrep之前,shell必須擴展模式(如果可能)。您沒有名爲*.test.txt的實際文件。

+0

我想通過一個把它們擴大到egrep並讓它在那裏擴大。我想這沒有關係,但那有可能嗎? – P1h3r1e3d13

+3

@ P1h3r1e3d13 Globbing(即根據表達式生成匹配的文件名)是shell的一個特性,而不是'egrep'。如果星號將其設置爲「egrep」,則它是該實用程序的文字星號。 – Fred

+0

哎呀,謝謝。 – P1h3r1e3d13

1

通配符字符必須在單引號或雙引號之外,因爲引號會禁用通配符。

用這個代替:

egrep "$1" '/usr/lusers/me/test/'*'test.txt' 

或者這樣:

egrep "$1" "/usr/lusers/me/test/"*"test.txt" 

或者,因爲沒有什麼會導致發生分詞這一特定模式中(但不會是一個總體安全的方式來做到這一點,如果路徑是不知道安全的提前):

egrep "$1" /usr/lusers/me/test/*test.txt 
相關問題