21

失敗したすべてのテストのログを調べ、ログにある現在のディレクトリ内のすべてのファイルのすべての名前を出力する非常に単純なシェル スクリプトを作成しています。

 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

誰かが理由を知っていますか?

ありがとう!!

4

3 に答える 3

27

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

$(grep $file failed.txt -c)は、あなたのケースでは 0 に評価されたコマンド置換です。したがって、この行は を読み取ります。これは、引数で[0 -ne 0]呼び出されたプログラムを実行すると解釈されます。[0-ne 0]

代わりに書くべきは[ $(grep $file failed.txt -c) -ne 0 ]. シェル スクリプトでは、左角括弧と右角括弧の間にスペースが必要です。それ以外の場合は、実行されるコマンドを変更します (終了]は、読み取る引数がこれ以上ないことを示します。

したがって、コマンドは と評価され[ 0 -ne 0 ]ます。これをシェルで実行して、何が起こるかを確認できます。式が true の場合と false[の場合の値で終了します。終了値は、エコーすることで確認できます(最後に実行されたコマンドの終了値)。01$?

于 2012-05-14T15:33:25.237 に答える
7

カウントをテストする代わりに、次のリターン コードをテストできますgrep

if grep -q $file failed.txt &>/dev/null
于 2012-05-14T15:37:38.767 に答える
1

スクリプトは

#!/bin/sh

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

または、ユーザー シェル コマンド履歴のワンライナーとして:

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

man grep

終了ステータス
選択した行が見つかった場合、終了ステータスは 0 になり、見つからなかった場合は 1 になります。エラーが発生した場合、終了ステータスは 2 です (注: POSIX エラー処理コードは「2」以上をチェックする必要があります)。

于 2012-05-14T17:51:37.800 に答える