2012-05-14 15 views
19

私は非常に単純なシェルスクリプトを書いています。これは失敗したすべてのテストのログを調べ、カレントディレクトリ内のログにあるすべてのファイルの名前をすべて出力します私はそれを実行するとシェルスクリプトのコマンドの出力を確認してください

1 #! /bin/sh 

2 for file in * 
3 do 
4  echo "checking: $file" 
5  if [$(grep $file failed.txt -c) -ne 0] 
6  then 
7   echo "$file FAILED" 
8  fi 
9 done 

、私はこのエラーを取得する:

line 6: [0: command not found 

誰が、なぜどんな考えを持っていますか?

ありがとうございます!

+0

for file in *; do { echo "checking: $file" && grep failed.txt $file && echo "$file FAILED"; done

移動したいです - if文の先頭にある – keyser

+4

には空白がありません: '' [$(grep $ fi le failed.txt -c)-ne 0] '' – redShadow

答えて

25

[は実際にはlinuxのコマンド(bashやcat、grepなど)です。

$(grep $file failed.txt -c)は、このようにラインが現在の引数-ne 0][0と呼ばれるプログラムを実行すると解釈される[0 -ne 0]を、読み、あなたの場合には0に評価され、コマンド置換です。

代わりに書くべき内容は[ $(grep $file failed.txt -c) -ne 0 ]です。シェルスクリプトでは、前後の角かっこの間にスペースが必要です。そうしないと、実行されたコマンドを変更(終値]を読むすべき複数の引数がないことを示している。

だから今のコマンドは[ 0 -ne 0 ]に評価されます。あなたは何が起こるかを見るためにあなたのシェルでこれを実行してみてください。[終了式が真である場合0の値を持つと1それがfalseの場合。あなたは$?(実行される最後のコマンドの終了値)をエコーで終了値を見ることができます。

+0

あなたはバックティックの無駄な使用を避けるべきです。 http://partmaps.org/era/unix/award.html#backticks(特に別の例をご覧ください)。 – tripleee

+0

@ tripleee良いアドバイスだが、このケースではgrepの出力がARG_LIMITと比較して小さくなる可能性が高いため、この場合は特に関係しません。 grep $ file failed.txt -q'が別のコメント 'で指摘されているように、理想的な解決策です。私は一般的に、スクリプトを読みにくくするために出力リダイレクトを使用することに熱心ではありません(読んで処理するためのトークンが増えます)。 – Dunes

+0

ああ、絶対に; 'もしgrep -q'が私がやっているものであれば。 (あなたは検索パターンとファイルの引数を逆にしているようですね) – tripleee

6

代わりのカウントをテストし、あなた戻りコードgrepをテストできます。

if grep -q $file failed.txt &>/dev/null 
+0

まあ、スクリプト全体を常に1行にすることもできます。 '猫は失敗した。txt | xargs ls -f1 2>/dev/null' – Dunes

+3

あなたは 'grep -q'を使って少し効率を上げます - 一致するものがあればすぐにgrepが終了します。 –

+1

'&>'リダイレクトはposixではありません。 Bashは '>/dev/null 2>&1'と同じ解釈をしますが、すべてのシェルを解釈するわけではありません。 (例えば、dashはバックグラウンドでgrepを起動し、/ dev/nullを切り捨てます) –

1

スクリプトが

#!/bin/sh 

for file in *; do 
    echo "checking: $file" 
    grep failed.txt $file && echo "$file FAILED" 
done 

や、ユーザーのシェルコマンド履歴のワンライナーとして使用できますman grep

EXIT STATUS
The exit status is 0 if selected lines are found, and 1 if not found. If an error occurred the exit status is 2. (Note: POSIX error handling code should check for '2' or greater.)

関連する問題