ifを使用するとエラーを引き起こす特殊文字を含む複数のステートメント

ifを使用するとエラーを引き起こす特殊文字を含む複数のステートメント

特定のコンテンツが特定のファイル/フォルダに見つからないことを確認し、「失敗」を印刷するスクリプトを作成しようとしました。それ以外の場合は、「成功」を印刷する必要があります。ただし、次のスクリプトではいくつかのエラーが発生します。

if [[ ( ! grep '/example.com' /opt/nfs &>/dev/null ) || ( ! grep -R '/example.com' /data &>/dev/null) ]]
then
echo "Failed"
else
echo "Passed"
fi

誰かがエラーが発生する理由とエラーを取り除き、予想される出力を取得する方法があるかどうかを教えてください。

更新:次のエラーが発生します。

s.sh: line 1: conditional binary operator expected
s.sh: line 1: expected `)'
s.sh: line 1: syntax error near `'/example.com''
s.sh: line 1: `if [[ ( ! grep '/example.com' /opt/nfs &>/dev/null ) || ( ! grep -R '/example.com' /data &>/dev/null) ]]'

答え1

[[...]]比較やその他のタイプのテストを実行するために使用される構成。ksh構文解析は特殊な構文規則に従い、標準コマンドを置き換えるコマンドです[(通常の単純なコマンド解析を使用)。

ここでは何も役に立ちません。テストするのは、コマンドが成功したかどうか(grepまたはコマンドではありません)なので、次のようになります。grep[[...]][

if grep -qF /example.com /opt/nfs || grep -RqF /example.com /data
then echo passed
else echo failed
fi

-qすべての一致を検索しようとする代わりに、1つの一致が見つかるとすぐに終了し、出力を抑制して最適化します。

答え2

直接方法:

grep -q '/example.com' /opt/nfs || grep -Rq '/example.com' /data
if [ $? -eq 0 ]; then   # check exit status
    echo "Passed"
else 
    echo "Failed"
fi

  • grepこのオプションは、-q標準出力に何も書き込まないように指示します。0一致するものが見つかると、エラーが検出された場合でも状態0で直ちに終了します。

  • $?- 含む終了ステータス最終的にコマンドを実行するコード


上記の式は次のように単純化することもできます。

if grep -q '/example.com' /opt/nfs || grep -Rq '/example.com' /data; then
    echo "Passed"
else 
    echo "Failed"
fi

答え3

ソリューションを簡素化する方法は次のとおりです。

  • まず、GNUを使用すると、grep引数行に提供されている複数のファイルフォルダから検索できます。したがって、デフォルトでは、2つのgrep異なるフォルダで同じパターンを見つけるために2つのコマンドを実行する必要はありません。grep '/example.com' /opt/nfs /dataそのジョブの検索が表示されます。/example.comこれら2つのフォルダに。
  • 最後の2つの否定は「はい」と同じです。それでは、単にこのコードを使用するとどうなりますか? "/example.com"がまたはif grep -rq "/example.com" /opt/nfs /data ; then echo "success" ; else echo "failed" ; fi grepに表示されるものが見つかったら成功します。/opt/nfs/data

grepシェルから1つだけが作成されるため、より高速で効率的です。

答え4

この試み:

if [[ ! $(grep '/example.com' /opt/nfs &>/dev/null) || ! $(grep -R '/example.com' /data &>/dev/null) ]]
then
echo "Failed"
else
echo "Passed"
fi

stdoutしかし、とを抑制したので、スクリプトが意味がないと思います。コマンドの出力は常に空です。抑制だけに置き換えられました。stderr&>/dev/nullgrep&2stderr

関連情報