switch sintaxis script not bash if-statement

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" ]