私はウェブサイトがダウンしているかどうか、そして何らかの理由で "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" ]]
いつ使用するかについても教えてください。
${STATUS}
が空でない限り、あなたは何をすべきですか。おそらくそれをする方が良いでしょう:
if ! [ "${STATUS}" -eq 200 ] 2> /dev/null && [ "${STRING}" != "${VALUE}" ]; then
または
if [ "${STATUS}" != 200 ] && [ "${STRING}" != "${VALUE}" ]; then
あなたが私たちにあなたのスクリプトで何が悪くなっているのか正確に示していないので、言うのは難しいです。
個人的な意見:[[
は絶対に使用しないでください。異なるシェルに移植することはできません。
これを試して:
if [ $STATUS -ne 200 -a "$STRING" != "$VALUE" ]; then
これを試して:
if [ ${STATUS} -ne 100 -a "${STRING}" = "${VALUE}" ]
または
if [ ${STATUS} -ne 100 ] && [ "${STRING}" = "${VALUE}" ]
見積もり:
"-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 filename
はif [ -f filename ]
と基本的に同じです(生成されたプロセスの観点から)。どちらの場合もtest
プログラムが起動され、両方のプロセスが同じように動作します。
これがあなたの過ちです:if [ $STATUS -ne 200 ] -a [[ "$STRING" != "$VALUE" ]]
はif
+何らかのジョブにパースします、ジョブはif
自体を除くすべてのものです。仕事は単純なコマンド(単一のプロセスになるものをbashで話す)だけです。つまり、最初のWord([
)はコマンドで、残りはその位置引数です。 最初の]
の後に引数が残っています。
そうではなく、[[
は確かにbashキーワードですが、この場合はコマンドの先頭にないため、通常のコマンド引数としてのみ解析されます。