2012-05-09 7 views
0

"find"コマンドを動的に作成して何かを返すかどうかを確認します。bashコマンドの置き換え:一重引用符でワイルドカードを使用したコマンドの検索

これは最小化された例です。ファイルを含むディレクトリに、

find . -name '*' 

もちろんファイルを返します。しかし、

VAR="find . -name '*'" 
$VAR 

は何も返しません。引用符の解釈の問題のように見えます。しかし、なぜ?

(実際のケースは、私は特定の接頭辞を持つファイルが存在するかどうかを確認したいということです。だから私は、-name '${MYPREFIX}*'を使う$()内の出力をキャプチャし、そして得られた文字列が空であるかどうかをテストするためのもの。)

謝罪これが些細なことであれば。私は答えを見つけるのに時間を費やしましたが、私が見つけたすべての事例は何とか異なっていました。通常、問題はfindコマンドがそれを行うべきときにシェルがワイルドカードを展開することです。ここでは、シェルは早すぎる展開をしませんが、findは文字通りの引用符を受け取っているのでどちらも見つからないでしょうか?どんな洞察もありがとう。

+0

単一引用符は、シェルを防止するためのものですワイルドカードを展開することはできませんが、それらは 'find'コマンドの一部ではなく、動作を停止したのは、ファイル名だけを検索し、一重引用符で終わるファイルだけを探すように指示することです。 'eval'は基本的にちょうどここで動作しますが、本当の解決策は引用文を修正することです。しかし、http://mywiki.wooledge.org/BashFAQ/050も参照してください。 – tripleee

答えて

2
eval $VAR 

evalは、引数付きのコマンドとして$VARの値を再解釈します。

注意:evalは強力ですが危険なメカニズムです。

+0

'echo $ VAR'は' eval $ VAR'の賢明な前兆です。 :-) –

+0

私は 'eval'を知っていると思っていましたが、' $() 'の中でそれが必要であるかもしれないことに気づいていませんでした。あなたの答えとkevの両方が私の問題を解決します。ありがとうございました! –

+0

"' eval'は危険です - 他のシェルスクリプトよりも危険はありません – user123444555621

0

可能であれば、evalを使用することをお勧めします。この場合、あなたが本当にそれを実行する前に、変数にコマンドを格納する必要がある場合、私は、配列を使用することをお勧めして、"${cmd_array[@]}"としてそれを呼び出すと思います:あなたはまた、動的findコマンドを構築することができ

var=(find . -name "${prefix}*") # This stores the elements of the command as an array 
result=$("${var[@]}") # This executes the command and stores its output in $result 

注意:

patterns=() # start with an empty list of patterns 
for prefix in $prefix_list; do 
    patterns+=(-o -name "${prefix}*") # add each prefix to a list of find patterns 
done 
patterns=("${patterns[@]:1}") # Use array slicing to remove the first "-o" 
result=$(find . "${patterns[@]}") 

は、あなたがそれを使用する方法に応じて、それはまた、bashの関数の中でfindコマンドをラップするために役立つかもしれない:

find_prefix() { 
    find . -name "${1}*" 
} 
result=$(find_prefix "$prefix") 
関連する問題