erro de sintaxe na expressão condicional ao executar o script de shell?

3

Estou trabalhando em um projeto no qual preciso fazer uma chamada de url para um dos meus servidores a partir do script de shell bash.

http://hostname.domain.com:8080/beat

Depois de atingir o URL acima, receberei a resposta abaixo, que preciso analisar e extrair o valor de syncs e syncs_behind

state: READY num_retries_allowed: 3 syncs: 30 syncs_behind: 100 num_rounds: 60 hour_col: 2 day_col: 0 oldest_day_col: 0

Agora preciso atingir o URL acima a cada 10 segundos por um período de 10 minutos e extrair o valor de syncs e syncs_behind dele e usá-lo para validá-lo com a condição abaixo -

syncs > 8
syncs_behind = 0

se o sync for maior que 8 e syncs_behind = 0, então terminarei meu shell script com alguma mensagem dizendo - "Os dados foram validados", caso contrário eu continuaria tentando por 10 minutos. Se nesse 10 Minuto janela, isso não acontece Eu vou terminar o script de shell de qualquer maneira, o que significa que não vou tentar novamente.

Então comecei com o código abaixo e salvei o arquivo como beat.sh com o conteúdo abaixo -

#!/bin/bash

COUNT=60   #number of 10 second timeouts in 10 minutes
SUM_SYNCS=0
SUM_SYNCS_BEHIND=0

while [[ $COUNT -ge "0" ]]; do

#send the request, put response in variable
DATA=$(wget -O - -q -t 1 http://hostname.domain.com:8080/beat)

#grep $DATA for syncs and syncs_behind
SYNCS=$(echo $DATA | grep -o 'syncs: [0-9]+' | awk '{print $2}')
SYNCS_BEHIND=$(echo $DATA | grep -o 'syncs_behind: [0-9]+' | awk '{print $2}')
echo $SYNCS
echo $SYNCS_BEHIND

#add new values to the sum totals
let SUM_SYNCS+=SYNCS
let SUM_SYNCS_BEHIND+=SYNCS_BEHIND

#verify conditionals
if [[ $SYNCS -gt "8" -a $SYNCS_BEHIND -eq "0" ]]; then exit -1; fi

#decrement the counter
let COUNT-=1

#wait another 10 seconds
sleep 10

done

E quando estou executando como ./beat.sh , recebi o erro abaixo

./beat.sh: line 23: syntax error in conditional expression
./beat.sh: line 23: syntax error near '-a'
./beat.sh: line 23: 'if [[ $SYNCS -gt "8" -a $SYNCS_BEHIND -eq "0" ]]; then exit -1; fi'

Qualquer pensamento que errado eu estou fazendo aqui?

    
por arsenal 07.03.2014 / 02:31

1 resposta

5

O [[ do Bash não suporta -a . Uma abordagem é usar [ e manter as coisas do mesmo jeito:

[ $SYNCS -gt "8" -a $SYNCS_BEHIND -eq "0" ]

Para melhores resultados com [ , deve-se citar duas variáveis:

[ "$SYNCS" -gt 8 -a "$SYNCS_BEHIND" -eq 0 ]

No caso geral, -a e -o devem ser evitados como o comando [ não pode analisar seus argumentos de forma confiável quando recebe mais de 4 (além de [ e ] ) . Então

[ "$SYNCS" -gt 8 ] && [ "$SYNCS_BEHIND" -eq 0 ]

Como alternativa , mantenha o [[ , mas use && para -a :

[[ $SYNCS -gt "8" && $SYNCS_BEHIND -eq "0" ]]

Muitas pessoas preferem [[ over [ porque as aspas duplas em torno das variáveis são desnecessárias.

Mas aqui, se você for usar a sintaxe específica de ksh / bash / zsh, para comparação aritmética, é melhor escrevê-la:

(( SYNCS > 8 && SYNCS_BEHIND == 0 ))

MORE: As linhas grep têm dois problemas. Como apontou Hauke, há um cólon supérfluo em um. Segundo, para usar a sintaxe [0-9]+ , ambas as linhas precisam da opção -E para regex estendida:

SYNCS=$(echo "$DATA" | grep -oE 'syncs: [0-9]+' | awk '{print $2}')
SYNCS_BEHIND=$(echo "$DATA" | grep -oE 'syncs_behind: [0-9]+' | awk '{print $2}')
    
por 07.03.2014 / 02:40