2015-04-12 132 views
1

我是bash的總noob,所以這很可能是語法錯誤,但我找不到任何在我的搜索中用於我的語法的東西。bash腳本 - 執行find命令不會輸出

從終端,運行
find . -name "*g*"
結果

./.grepdir.sh.swp 
./grepdir.sh 

但是,運行稱爲grepdir.sh

#!/usr/bin/bash 
startdir="$1"; 
pattern="$2"; 
find_cmd="find $startdir -name \"$pattern\""; 
echo "$find_cmd"; 

cmd="$($find_cmd)"; 
echo "$cmd"; 

從終端作爲grepdir.sh . "*g*"結果這個bash腳本在:

[[email protected]~/dir]$ grepdir.sh . "*g*" 
find . -name "*g*" 

[[email protected]~/dir]$ 

這意味着cmd必須爲空。但根據我的理解,存儲在find_cmd中的字符串已執行並且輸出捕獲到cmd,這意味着它不應該爲空。我有錯誤觀念,還是我的語法太糟糕了?

感謝

+0

使用'CMD = $(bash -c「$ find_cmd」)似乎解決了這個問題。但我不明白你不工作的原因。 – tivn

回答

1

與你的腳本版本的問題是,你加引號實際上已經成爲尋找論據的一部分。所以你要求它搜索包含"*g*"以及引號的文件名。

如果您放棄添加引號並且只是說find_cmd="find $startdir -name $pattern";,那麼它適用於不包含特殊字符的模式。後來我想,也許這會工作:

grepdir.sh . \*g\* 

甚至

grepdir.sh . \\\*g\\\* 

,但沒有。這些事總是棘手....

編輯:A-HA,這個版本似乎工作:

#!/usr/bin/bash 
startdir="$1"; 
pattern="$2"; 
find_cmd="find $startdir -name $pattern"; 
echo "$find_cmd"; 

GLOBIGNORE=$pattern 
cmd="$($find_cmd)"; 
echo "$cmd"; 
+0

你不用C語言編寫代碼,因此沒有理由使用';'元字符來結束每一行。 – user3439894

+0

對,我沒有注意到,我只是複製原件。但我沒有添加一個;到我添加的額外行。 :-) –

+0

+1。但真正的答案只是[不要把命令和參數放在一個變量中](http://mywiki.wooledge.org/BashFAQ/050) – BroSlow

0

我通常做這種方式 - >

#!/bin/bash 
dir=$1 
file="*$2*" 
find $dir -iname $file -print 
+0

你應該包含你的代碼的解釋。描述此代碼如何以及爲何解決問題更有用,因爲它可以幫助OP和其他讀者自己解決這個問題和類似的問題。 –