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