Estoy tratando de crear una secuencia de comandos Bash simple para verificar si el sitio web no funciona 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 aconsejar cuándo usar:
- corchetes simples y dobles
- paréntesis
?
bash
if-statement
HTF
fuente
fuente
-a
Tiene duplicidad. Cuando se usa con eltest
comando de estilo de shell Bourne , también conocido como[
, significaand
. Cuando se usa como una expresión condicional , se está probando para ver si existe un archivo. Sí, es confuso, es mejor evitarlo.Respuestas:
Lo que tienes debe funcionar, a menos que
${STATUS}
esté vacío. Probablemente sería mejor hacer:o
Es difícil de decir, ya que no nos ha mostrado exactamente qué está mal con su script.
Opinión personal: nunca usar
[[
. Suprime mensajes de error importantes y no es portátil a diferentes shells.fuente
STATUS
está vacío, el código de @HTF habría fallado-ne: unary operator expected
. En su caso, fallaráinteger expression expected
, ¿no?$STATUS
podría estar vacío y sugiere una solución (citando). Su solución aún falla con un vacíoSTATUS
, eso es todo lo que quise decir.${STATUS:-0"
. Se editará.STATUS=; [ $STATUS -ne 13 ] 2>/dev/null && echo foo
no se emitefoo
, aunque debería (vacío es diferente de 13). Lo que sugirió por primera vez, se${STATUS:-0}
ve mucho mejor.${STATUS:-0}
fallará siSTATUS=foo
, pero! [ "$STATUS" -eq 200 ] 2> /dev/null && echo foo
funciona. En mi opinión, es mejor evitar-eq
y usar!=
.Prueba esto:
fuente
Prueba esto:
o
fuente
Citar:
Para una explicación más elaborada:
[
y]
no son palabras reservadas de Bash. Laif
palabra clave introduce un condicional para ser evaluado por un trabajo (el condicional es verdadero si el valor de retorno del trabajo es0
o falso en caso contrario).Para pruebas triviales, existe el
test
programa (man test
).Como algunos encuentran líneas como
if test -f filename; then foo bar; fi
, etc. molestas, en la mayoría de los sistemas encuentras un programa llamado[
que de hecho es solo un enlace simbólico altest
programa. Cuandotest
se llama como[
, debe agregar]
como último argumento posicional.Entonces
if test -f filename
es básicamente lo mismo (en términos de procesos generados) queif [ -f filename ]
. En ambos casos, eltest
programa se iniciará y ambos procesos deberían comportarse de manera idéntica.Aquí está su error:
if [ $STATUS -ne 200 ] -a [[ "$STRING" != "$VALUE" ]]
analizaráif
+ algún trabajo, el trabajo es todo excepto elif
propio. El trabajo es solo un comando simple (Bash habla por 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, no
[[
es una palabra clave Bash, pero en este caso solo se analiza como un argumento de comando normal, porque no está al frente del comando.fuente