255

Web サイトがダウンしていて、何らかの理由で「and」演算子が機能しないかどうかを確認する単純な Bash スクリプトを作成しようとしています。

#!/usr/bin/env bash

WEBSITE=domain.com
SUBJECT="$WEBSITE DOWN!"
EMAILID="an@email.com"
STATUS=$(curl -sI $WEBSITE | awk '/HTTP\/1.1/ { print $2 }')
STRING=$(curl -s $WEBSITE | grep -o "string_to_search")
VALUE="string_to_search"

if [ $STATUS -ne 200 ] && [[ "$STRING" != "$VALUE" ]]; then
    echo "Website: $WEBSITE is down, status code: '$STATUS' - $(date)" | mail -s "$SUBJECT" $EMAILID
fi

「-a」演算子も機能しません。

if [ $STATUS -ne 200 ] -a [[ "$STRING" != "$VALUE" ]]

また、いつ使用するかアドバイスをお願いします:

  • 一重角括弧と二重角括弧
  • 括弧

?

4

5 に答える 5

371

${STATUS}が空でない限り、あなたが持っているものはうまくいくはずです。おそらく次のようにする方が良いでしょう:

if ! [ "${STATUS}" -eq 200 ] 2> /dev/null && [ "${STRING}" != "${VALUE}" ]; then

また

if [ "${STATUS}" != 200 ] && [ "${STRING}" != "${VALUE}" ]; then

スクリプトの何が問題なのかを正確に示していないため、なんとも言えません。

個人的な意見: 絶対に使用しないで[[ください。重要なエラー メッセージを抑制し、異なるシェルに移植できません。

于 2012-11-16T00:22:52.077 に答える
33

これを試して:

if [ $STATUS -ne 200 -a "$STRING" != "$VALUE" ]; then
于 2012-11-16T00:25:11.163 に答える
15

見積もり:

「-a」演算子も機能しません。

if [ $STATUS -ne 200 ] -a [[ "$STRING" != "$VALUE" ]]

より詳細な説明: [and]は Bash の予約語ではありません。このifキーワードは、ジョブによって評価される条件を導入します (条件は、ジョブの戻り値が である場合は true、0それ以外の場合は false です)。

簡単なテストには、testプログラム ( man test) があります。

などのような行がif test -f filename; then foo bar; fi煩わしいと感じる人もいるように、ほとんどのシステム[では、実際にはプログラムへのシンボリックリンクにすぎないというプログラムが見つかりますtesttestが as として呼び出される場合、最後の位置引数として[追加する必要があります。]

Soif test -f filenameは基本的に (生成されたプロセスに関して) と同じif [ -f filename ]です。どちらの場合も、testプログラムが開始され、両方のプロセスが同じように動作するはずです。

ここにあなたの間違いがあります: + いくつかのジョブにif [ $STATUS -ne 200 ] -a [[ "$STRING" != "$VALUE" ]]解析されます。ジョブはそれ自体を除くすべてです。ジョブは単純なコマンド(Bash は単一のプロセスをもたらすものを意味します) にすぎません。つまり、最初の単語 ( ) がコマンドで、残りはその位置引数です。最初の の後に引数が残っていますifif[]

また、[[実際には Bash キーワードではありませんが、この場合、コマンドの先頭にないため、通常のコマンド引数としてのみ解析されます。

于 2012-11-16T01:05:10.543 に答える