シェルスクリプトwhileループ:パイプの周りに["]"がありません。

シェルスクリプトwhileループ:パイプの周りに[

使用するシェルスクリプトでこのエラーが発生し続けます。

$ ./script.sh: line 2: [: missing `]' 
grep: ]: No such file or directory

この行は、特定のプロセスがファイルをロックすることを確認するセクションの一部です。

COUNTER=0
while [ ps aux | grep "[r]elayevent.sh" ] && [ "$COUNTER" -lt 10 ]; do
    sleep 3
    let COUNTER+=1
done

明らかに、私は角括弧がすべて正しく対になっていることを確認しました。これは私にとっては大丈夫に見えます。また、条件付き質問の周りの一般的なスペースは適用されません。

私がここで何を見逃しているのでしょうか?

ベストアンサー1

エラーは、[終了状態を確認した後、命令を直接使用したいので、まず削除する必要があることです。

ウィキページ住宅検査ツールこれについての説明があります(問題SC1014):

[ .. ]ifステートメントなどのシェル構文の一部ではありません。 Cに似た言語では、括弧と同じではなく、if (foo) { bar; }テストするコマンドを束ねてはいけません。

[whoamiorのような一般的なコマンドgrepですが、面白い名前があります(参照ls -l /bin/[)。の略ですtest

コマンドの終了状態を確認するには、そのコマンドを直接使用します。

コマンドの出力を確認するには、文字列比較のためにまたは/を"$(..)"使用して出力を取得します。test[[[

また、ps aux | grep -q "[r]elayevent.sh"これを使用するとstdout

pgrepまたはその出力を使用して/dev/null

最後のケースではより効率的であるため、最初の条件を最初に使用してください。

したがって、最終スクリプトは次のようになります。

#!/bin/bash
COUNTER=0

while [ "$COUNTER" -lt 10 ] && ps aux | grep -q "[r]elayevent.sh"   ; do

    sleep 3

    let COUNTER+=1

done

または

#!/bin/bash
COUNTER=0

while [ "$COUNTER" -lt 10 ] && pgrep  "[r]elayevent.sh" >/dev/null  ; do

    sleep 3

    let COUNTER+=1

done

おすすめ記事