2016-04-21 15 views
2

我有以下功能f() { find . -name "$1"}這只是一個方便的快捷方式,用於查找帶有名稱的文件。如果我在終端執行find . -name "*.gradle"我得到:將glob結果傳遞給一個函數,丟棄除第一個文件以外的所有文件

./.gradle 
./app/build.gradle 
./build.gradle 
./dependencies.gradle 
./settings.gradle 
./wearable/build.gradle 

如果我在終端,我得到執行f *.gradle

./app/build.gradle 
./build.gradle 
./wearable/build.gradle 

的第一個結果是正確的,也是有用的。即使內容相同,爲什麼我在使用我的函數時得到這個'錯誤'結果?我錯誤地注入了$1參數嗎?

+1

您的語法錯誤。也許你的意思是'f(){find。 -name「$ 1」; '',或者你的真實代碼有換行符? –

回答

2
f *.gradle 

擴大了水珠,在當前目錄下,然後可以運行類似下面用文件的列表替換*.gradle

$ f one.gradle two.gradle 
# $1   $2 

然後運行:

find . -name one.gradle 

...只傳遞第一個文件($1),並忽略所有其他文件。


如果你想通過傳遞水珠發現:

f '*.gradle' 
+0

是否可以在不使用'''的情況下使'f * .gradle'工作? – Niklas

+0

不。(關於該主題已經在知識庫中有明確的問題,順便說一下)。 –

+0

@Niklas,...看到,例如,http://stackoverflow.com/questions/11456403/stop-shell-wildcard-character-expansion –

4

您需要在當前shell事先使用引號,以防止膨脹,讓擴張採取函數內的地方:

f '*.gradle' 
+0

是否有可能使'f * .gradle'工作,而不使用' 「'? – Niklas

+0

@Niklas然後你需要使用'$ @'來表示'f'中的所有位置參數(不僅僅是第一個):'f(){find。 -name「$ @」;}' – heemayl

+0

@heemayl,在這裏實際上不會工作 - 你需要構建'-name「$ 1」-o -name「$ 2」'等,然後,它只包含名稱與當前目錄中的glob目標匹配的文件,而不包含在子目錄中。 –

相關問題