O script Bash lança “erro de sintaxe próximo ao token inesperado '}'” quando é executado

0

Eu estou tentando escrever um script para monitorar alguns status da bateria em um laptop rodando como um servidor. Para conseguir isso, eu já comecei a escrever este código:

#! /bin/bash
# A script to monitor battery statuses and send out email notifications

#take care of looping the script
for (( ; ; ))
do

#First, we check to see if the battery is present...
if(cat /proc/acpi/battery/BAT0/state | grep 'present: *' == present:                 yes)
    {
        #Code to execute if battery IS present

        #No script needed for our application
        #you may add scripts to run
    }
else
    {
        #if the battery IS NOT present, run this code
        sendemail -f [email protected] -t 214*******@txt.att.net -u NTA TV Alert -m "The battery from the computer is either missing, or removed. Please check ASAP." -s smtp.gmail.com -o tls=yes -xu [email protected] -xp ***********
    }



#Second, we check into the current state of the battery
if(cat /proc/acpi/battery/BAT0/state | grep 'charging state: *' == 'charging state:                     charging')
    {
        #Code to execute if battery is charging
        sendemail -f [email protected] -t 214*******@txt.att.net -u NTA TV Alert -m "The battery from the computer is charging. This MIGHT mean that something just happened" -s smtp.gmail.com -o tls=yes -xu [email protected] -xp ***********
    }
#If it isn't charging, is it discharging?
else if(cat /proc/acpi/battery/BAT0/state | grep 'charging state: *' == 'charging     state:                 discharging')
    {
        #Code to run if the battery is discharging
        sendemail -f [email protected] -t 214*******@txt.att.net -u NTA TV Alert -m "The battery from the computer is discharging. This shouldn't be happening. Please check ASAP." -s smtp.gmail.com -o tls=yes -xu [email protected] -xp ***********
    }
#If it isn't charging or discharging, is it charged?
else if(cat /proc/acpi/battery/BAT0/state | grep 'charging state: *' == 'charging state:                 charged')
    {
        #Code to run if battery is charged
    }



done

Tenho certeza de que a maioria das outras coisas funciona corretamente, mas não consegui experimentá-lo porque ele não será executado. sempre que tento executar o script, este é o erro que recebo:

./BatMon.sh: line 15: syntax error near unexpected token '}'
./BatMon.sh: '      }'

o erro é algo super simples como um ponto e vírgula esquecido?

    
por Tab00 19.06.2012 / 04:13

1 resposta

3

Alguns problemas aqui:

Em primeiro lugar, não é assim que você escreve declarações if / else no bash. Em vez disso, você precisa de algo como:

if <condition>
then
    <action>
elif <other-condition>
then
    <other-action>
else
    <another-action>
fi

Em segundo lugar, o condition que você está verificando aqui não funcionará. a instrução if verificará o valor de retorno de condition . Portanto, você precisa que a condição seja um comando (ou pipeline de comandos) que retornará um status de saída zero ou diferente de zero.

Então, tente algo como:

if grep 'present:.*yes' /proc/acpi/battery/BAT0/state
then
    # code to execute if battery is present
else
    # code to execute if battery is not present
fi

Neste caso, o grep terá sucesso (isto é, retornará um status de saída zero) se o arquivo BAT0/state corresponder ao padrão present:.*yes .

Se você precisar fazer correspondência de string, precisará usar o comando [ com um operador = :

if [ "$somevar" = 'some-string' ]
then
    # code to execute when $somevar equals 'some-string'
fi

Para obter mais informações sobre if -statements no bash, consulte a ajuda para if :

help if

Ou, veja a página de manual bash para informações gerais sobre programação:

man bash
    
por Jeremy Kerr 19.06.2012 / 04:27