sintaxis - Bash-un operador "y" para la declaración "if"
shell script linux if condition (4)
Intento crear un script bash simple para verificar si el sitio web está caído y por alguna razón el operador "y" no 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
El operador "-a" tampoco funciona:
if [ $STATUS -ne 200 ] -a [[ "$STRING" != "$VALUE" ]]
¿Podría también aconsejarme cuándo usarlo?
- corchetes simples y dobles
- paréntesis
Citar:
El operador "-a" tampoco funciona:
if [$ STATUS -ne 200] -a [["$ STRING"! = "$ VALUE"]]
Para una explicación más elaborada: [
y ]
no hay palabras reservadas bash. La palabra clave if
introduce un condicional para ser evaluado por un trabajo (el condicional es verdadero si el valor de retorno del trabajo es 0
o falso en caso contrario).
Para pruebas triviales, está el programa de test
( man test
).
Como algunos encuentran líneas como if test -f filename; then foo bar; fi
if test -f filename; then foo bar; fi
if test -f filename; then foo bar; fi
etc. molesto, en la mayoría de los sistemas se encuentra un programa llamado [
que de hecho es solo un enlace simbólico al programa de test
. Cuando la test
se llama como [
, debe agregar ]
como último argumento posicional.
Por if test -f filename
tanto, if test -f filename
es básicamente el mismo (en términos de procesos generados) como if [ -f filename ]
. En ambos casos, se iniciará el programa de test
y ambos procesos se comportarán de manera idéntica.
Aquí está su error: if [ $STATUS -ne 200 ] -a [[ "$STRING" != "$VALUE" ]]
se analizará if
+ algún trabajo, el trabajo es todo excepto el if
mismo. El trabajo es solo un comando simple (bash speak para algo que resulta en un solo proceso), lo que significa que la primera palabra ( [
) es el comando y el resto sus argumentos posicionales. Hay argumentos restantes después del primero ]
.
Además, [[
es de hecho una palabra clave bash, pero en este caso solo se analiza como un argumento de comando normal porque no está en la parte frontal del comando.
Lo que tienes debe funcionar, a menos que $STATUS
esté vacío. Probablemente sería mejor hacer:
if ! [ "$STATUS" -eq 200 ] 2> /dev/null && [ "$STRING" != "$VALUE" ]; then
o
if [ "$STATUS" != 200 ] && [ "$STRING" != "$VALUE" ]; then
Es difícil de decir, ya que no nos has mostrado exactamente qué está mal con tu script.
Opinión personal: nunca use [[
. No es portátil para diferentes conchas.
Prueba esto:
if [ $STATUS -ne 200 -a "$STRING" != "$VALUE" ]; then
Prueba esto:
if [ $status -ne 100 -a "$STRING" = "$VALUE" ]
o
if [ $status -ne 100 ] && [ "$STRING" = "$VALUE" ]