web-dev-qa-db-ja.com

Bash - "if"ステートメントのの "and"演算子

私はウェブサイトがダウンしているかどうか、そして何らかの理由で "and"演算子が機能しないことをチェックするための単純なbashスクリプトを作成しようとしています。

#!/usr/bin/env bash

WEBSITE=domain.com
SUBJECT="$WEBSITE DOWN!"
EMAILID="[email protected]"
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" ]]

いつ使用するかについても教えてください。

  • シングルとダブルの角括弧
  • 括弧
122
HTF

${STATUS}が空でない限り、あなたは何をすべきですか。おそらくそれをする方が良いでしょう:

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

または

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

あなたが私たちにあなたのスクリプトで何が悪くなっているのか正確に示していないので、言うのは難しいです。

個人的な意見:[[は絶対に使用しないでください。異なるシェルに移植することはできません。

190
William Pursell

これを試して:

if [ $STATUS -ne 200 -a "$STRING" != "$VALUE" ]; then
23
BrenanK

これを試して:

if [ ${STATUS} -ne 100 -a "${STRING}" = "${VALUE}" ]

または

if [ ${STATUS} -ne 100 ] && [ "${STRING}" = "${VALUE}" ]
13
AnshBikram

見積もり:

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

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

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

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

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

そのため、if test -f filenameif [ -f filename ]と基本的に同じです(生成されたプロセスの観点から)。どちらの場合もtestプログラムが起動され、両方のプロセスが同じように動作します。

これがあなたの過ちです:if [ $STATUS -ne 200 ] -a [[ "$STRING" != "$VALUE" ]]if +何らかのジョブにパースします、ジョブはif自体を除くすべてのものです。仕事は単純なコマンド(単一のプロセスになるものをbashで話す)だけです。つまり、最初のWord([)はコマンドで、残りはその位置引数です。 最初の]の後に引数が残っています

そうではなく、[[は確かにbashキーワードですが、この場合はコマンドの先頭にないため、通常のコマンド引数としてのみ解析されます。

10
Jo So