Estou tentando criar um script Bash simples para verificar se o site está inoperante e, por algum motivo, o operador "and" não funciona:
#!/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
O operador "-a" também não funciona:
if [ $STATUS -ne 200 ] -a [[ "$STRING" != "$VALUE" ]]
Você também pode aconselhar quando usar:
- colchetes simples e duplos
- parêntese
?
bash
if-statement
HTF
fonte
fonte
-a
tem duplicidade. Quando usado com otest
comando de estilo de shell Bourne , também conhecido como[
, significaand
. Quando usado como uma expressão condicional , ele está testando para ver se existe um arquivo. Sim, é confuso, é melhor evitar.Respostas:
O que você tem deve funcionar, a menos que
${STATUS}
esteja vazio. Provavelmente seria melhor fazer:ou
É difícil dizer, pois você não nos mostrou exatamente o que está acontecendo de errado com seu script.
Opinião pessoal: nunca use
[[
. Ele suprime mensagens de erro importantes e não é portátil para diferentes shells.fonte
STATUS
estiver vazio, o código de @HTF falharia-ne: unary operator expected
. No seu caso, ele falharáinteger expression expected
, não é?$STATUS
pode estar vazio e sugere uma solução (citando-o). Sua solução ainda falha com um vazioSTATUS
, é isso que eu quis dizer.${STATUS:-0"
. Será editada.STATUS=; [ $STATUS -ne 13 ] 2>/dev/null && echo foo
não gerafoo
, mesmo que deva (vazio é diferente de 13). O que você sugeriu primeiro${STATUS:-0}
parece muito melhor.${STATUS:-0}
falhará seSTATUS=foo
, mas! [ "$STATUS" -eq 200 ] 2> /dev/null && echo foo
funcionar. IMO, no entanto, é melhor evitar-eq
e usar!=
.Tente o seguinte:
fonte
Tente o seguinte:
ou
fonte
Citar:
Para uma explicação mais elaborada:
[
e]
não são palavras reservadas no Bash. Aif
palavra-chave introduz um condicional a ser avaliado por um trabalho (o condicional é verdadeiro se o valor de retorno do trabalho for0
falso ou não).Para testes triviais, existe o
test
programa (man test
).Como alguns consideram linhas como
if test -f filename; then foo bar; fi
etc. irritantes, na maioria dos sistemas, você encontra um programa chamado[
que na verdade é apenas um link simbólico para otest
programa. Quandotest
é chamado como[
, você deve adicionar]
como o último argumento posicional.Então
if test -f filename
é basicamente o mesmo (em termos de processos gerados) queif [ -f filename ]
. Nos dois casos, otest
programa será iniciado e os dois processos deverão se comportar de forma idêntica.Aqui está o seu erro:
if [ $STATUS -ne 200 ] -a [[ "$STRING" != "$VALUE" ]]
analisaráif
+ algum trabalho, o trabalho sendo tudo, exceto oif
próprio. O trabalho é apenas um comando simples (o Bash fala por algo que resulta em um único processo), o que significa que a primeira palavra ([
) é o comando e o restante, seus argumentos posicionais. Existem argumentos restantes após o primeiro]
.Também não
[[
é , de fato, uma palavra-chave do Bash, mas, neste caso, é analisada apenas como um argumento de comando normal, porque não está na frente do comando.fonte