2011-10-30 13 views
3

bashのコマンドで関数の使用に関する質問があります。 getRegexは私の関数で、ファイルの最後に定義されています。私が使用するコマンドは以下の通りです:私はそれを呼び出す場合、このメソッドが正しく動作する2にそれを分割しても、bashコマンドで関数を呼び出す

COUNT=`grep -rnE 'getRegex' $HOME/new` 

は今、私は別の亜種の多くを試みたが、私はそれを動作させることができません以下の通り:getRegex。私の欠点は何ですか? TIA

答えて

3

答えるためにキーワードを使用すると、man bashやGoogleで見つけることができる"bash command substitution"、です。

ところで、ここでは二重引用符が重要です。 `COUNT = $(grepの-rnE '$(getRegex)' $ HOME /新)`を返す: `10行目:getRegex:コマンドではありませんが、あなたの答えを

#!/bin/bash 

function my_func() { 
    echo "no" 
} 

string="no you don't 
no you don't 
no you don't 
no you don't 
no you don't" 


COUNT="$(echo "${string}" | grep "$(my_func)" -c)" 
echo "${COUNT}" 

そして

$> ./ok.sh 
5 
0

別のbashコマンドでbashコマンドを呼び出そうとしている場合、内部コマンド(ここではgetRegex)をバックティック``で囲む必要があります。そうしないと、テキストとして解釈されます。ここにバッククォートがあるので、内側のものをエスケープする必要があります。これを試してみてください:

COUNT=`grep -rnE '\`getRegex\`' $HOME/new` 

しかし、POSIXの驚異によって、私たちは別の構文を使うことができます。バックチックを使用する場所であれば、$()を使用することもできます。だから、バックスラッシュ嘔吐を避けるために、あなたが書くことができる:

COUNT=$(grep -rnE '$(getRegex)' $HOME/new) 
+0

感謝見つけた。 – user1020822

+0

@ダン、実際にコードが実行されたことを確認しましたか? 2番目の例では一重引用符については確信していますか? –

+0

dmalikovはもちろん正しいですが、それらは二重引用符でなければなりません.bashの一重引用符は変数を展開しないためです。 – Dan