Verificação de erro de script Bash usando contagem de palavras e awk

1

Preciso de uma luz no meu script Estou fazendo uma contagem de palavras em uma variável obter um valor 0 ou maior, mas parece que o script está quebrando nesta função variável count_check = wc -l $TABLE_CHECKS | awk '{print $1}' ou se [$ count_check -eq 0] veja meu código abaixo.

#!/bin/bash -x
set -e
set -u


#
# Routine to check integrity of the restored backup
#


TABLE_CHECKS="$(mktemp -p .)"

mysqlcheck -e -c --all-databases | grep -e error -e Error > $TABLE_CHECKS 

        # if [ $? -eq 0 ]
            # then
              # echo "mysqlcheck running ..."
            # else
              # echo "mysqlcheck error !"
              # exit 1
        # fi

count_check='wc -l $TABLE_CHECKS | awk '{print $1}'' 
        if [ $count_check -eq 0 ]
            then
              echo "Tables ok..."
            else
              echo "Error on one or more tables. Check  output file: table_checks.txt"
              cat $TABLE_CHECKS > table_checks-'date +%Y-%m-%d_%Hh%Mm%Ss'.txt
              rm -f $TABLE_CHECKS
              exit 1
        fi

rm -f $TABLE_CHECKS

exit 0


I've tried changing the comparison instead of using -eq I was using = , == .

Precisa de ajuda dos especialistas, pois isso leva mais tempo do que o necessário. Além disso, outras maneiras de obtê-las são bem-vindas, pois estou limitado em scripts.

Obrigado antecipadamente!

    
por Haohmaru 15.07.2016 / 14:20

2 respostas

2

Finalize sua instrução awk e sempre use aspas adequadas ao usar o bash.

Finalmente, "[" como test é para o Bourne Shell sh ; use "[[" ao escrever scripts Bourne-Again Shell ( bash ).

As expressões Grep podem não funcionar da mesma maneira em todos os sistemas. Eu tentei tornar o seu mais genérico.

#!/bin/bash -x

# don't set flags unless you know you need 'em. 

#
# Routine to check integrity of the restored backup
#

TABLE_CHECKS="table_checks-'date +%Y-%m-%d_%Hh%Mm%Ss'.txt"
mysqlcheck -e -c --all-databases > $TABLE_CHECKS

# grep can do the work you want in one step.
count_check="$(grep -c -E '(error|Error)' $TABLE_CHECKS)"

# What did you get?
echo "count_check is: \"${count_check}\""

# unnecessary indenting makes this hard to read
if [[ $count_check -eq 0 ]]
then
    echo "Tables ok..."
    rm $TABLE_CHECKS
    exit 0
else
    echo "Error on one or more tables. Check output file: ${TABLE_CHECKS}"
    exit 1
fi
    
por 15.07.2016 / 14:59
2

Você já descobriu que seu problema é a interação entre set -e e grep que não correspondiam a nada. Você pode adicionar || true para evitar isso, mas veja abaixo.

Em vez de contar as linhas no arquivo, você pode simplesmente testar se há alguma coisa no arquivo:

if [ -s "TABLE_CHECKS" ] ; then
    NEW_TABLE_CHECKS=table_checks-'date +%Y-%m-%d_%Hh%Mm%Ss'.txt
    echo "Error on one or more tables. Check  output file: $NEW_TABLE_CHECKS"
    mv $TABLE_CHECKS $NEW_TABLE_CHECKS
    exit 1
fi

Melhor ainda, evitando o comportamento grep / set -e colocando-o em if :

if mysqlcheck -e -c --all-databases | grep -E '(error|Error)' > $TABLE_CHECKS ; then
    NEW_TABLE_CHECKS=table_checks-'date +%Y-%m-%d_%Hh%Mm%Ss'.txt
    mv $TABLE_CHECKS $NEW_TABLE_CHECKS
    echo "Error on one or more tables. Check output file: $NEW_TABLE_CHECKS. Contents of file follow:"
    cat $NEW_TABLE_CHECKS
    exit 1
fi
    
por 15.07.2016 / 15:08