2012-01-16 6 views
6

コードで提供されているリダイレクトが機能しない理由がわかりません。スクリプトを実行するたびに、出力ファイルは常に空です。誰かがそれについてアイデアを持っていますか?grepの出力をファイルにリダイレクト

ありがとうございました。

#!/bin/sh 

LOOK_FOR="DefaultProblem" 
FILES=`ls plugins/*source*.jar` 

for i in $FILES 
    do 
    # echo "Looking in $i ..." 
    unzip -p $i | grep -i $LOOK_FOR > output #> /dev/null 
    if [ $? == 0 ] 
    then 
     echo ">>>> Found $LOOK_FOR in $i <<<<" 
    fi 
    done 
+2

今後の参考として、「機能しません」はあまりよくありません。どのように動作しないのか教えてください。 –

+1

今後のご質問には非常に関連している可能性があります。私は問題に関連する何かを、すでに答えられているので、何も言わなかった。これはコメントのためのものです。私は本当にここであなたを助けようとしています。私は有効なポイントがある可能性を考慮してください。 –

+1

@fabricemarcelin:コメントを投稿する* is *ディスカッションに参加しています –

答えて

9

あなたはとリダイレクトに(上書き)の代わりに>の(追加)>>を使用する必要があります、あなたがループ内でこのコマンドを実行すると、ファイルoutputたびに上書きしているので

unzip -p $i | grep -i $LOOK_FOR >> output #> /dev/null 

が最後に空白になる可能性があります。 grepの最後のコマンドでunzip出力に一致する行が見つからない場合は、

+0

素晴らしい、それは魅力のように動作します。私は全く考えなかった。おかげで – fabricemarcelin

+0

あなたはそれがあなたのために働いたことを嬉しく思います。 – anubhava

3

あなたはlsの出力を解析することを試みてはいけない三つの問題

  1. を持っています。代わりにfor i in plugins/*source*.jarを使用してください。主な理由は、スクリプトが名前にスペースを含むファイルを完全に完全に破棄するということです。なぜあなたは、ループの各反復で出力ファイルを上書きします後者のよう>>の代わり>を使用する必要がls
  2. 解析していない理由の連祷のためthis linkを参照してください。前者はに追加する
  3. 引用符を使用してください!変数を引用符で囲み、単語分割を行わないようにしてください。

また、ifのテストをインライン化することもできます。だから我々はすべて一緒にそれを持って置く:代わりfor loop

#!/bin/sh 

LOOK_FOR="DefaultProblem" 
for i in plugins/*source*.jar 
do 
    # echo "Looking in $i ..." 
    if unzip -p "$i" | grep -i "$LOOK_FOR" >> output #> /dev/null 
    then 
     echo ">>>> Found $LOOK_FOR in $i <<<<" 
    fi 
done 
+0

チップのおかげで、私はそれを考慮に入れます。 – fabricemarcelin

+2

これは複数のファイルを検索していますが、一度に一つずつ行うので、 'grep'の出力には各行がどのファイルから来たのかを示すファイル名は含まれません。場合によっては '/ dev/null'を' grep'コマンドラインに追加することで修正できます。残念ながら、これはそれらの機会の一つではありません。あなたは以下を追加する必要があります: '| 'sed" s%^%$ i:% "'の '' 'リダイレクトの前に。 –

+0

@JonathanLeffler良いアイデアですが、この場合、 'grep'に' -l'フラグを使用することをお勧めします。 – SiegeX

0

if conditionalあなたは1つのfindコマンドで

find /path/to/plugins -name "*source*.jar" -exec sh -c 'unzip -l "{}" | grep -q DefaultProblem' \; -print 
+0

'find'の出力を使用しても、名前にスペースが含まれているファイルで壊れます。これを修正する方法は、 '-print0'フラグを使って' find'を呼び出し、 'while IFS = -r -d '' line'ループをプロセス置換を使ってbashで行います。または、Bash 4のglobstar – SiegeX

+0

Trueを使用する方が良いでしょう。あなたの答えは本当にすべての潜在的な問題をカバーしています。悪いことをして、私を削除してください。 :) –

+0

@SiegeX新しいものを提供するための答えを修正しました。 –

2

をすべてを行うことができますが、ループ全体の出力リダイレクトすることができます。

#!/bin/sh 

LOOK_FOR="DefaultProblem" 
FILES=`ls plugins/*source*.jar` 

for i in $FILES ; do 
    # echo "Looking in $i ..." 1>&2 
    unzip -p $i | grep -i $LOOK_FOR 
    if [ $? == 0 ] ; then 
     echo ">>>> Found $LOOK_FOR in $i <<<<" 1>&2 
    fi 
done > output 

診断メッセージをstderrにリダイレクトしました。

関連する問題