determina se a saída é uma string ou um inteiro

0

Eu estou tentando escrever um script que se conecta a um banco de dados, em seguida, executar uma consulta que retorna contagem de linhas em uma tabela. às vezes banco de dados ou tabela tem problemas e, em vez de um inteiro, eles retornam um erro. por exemplo:
A database connection does not exist
Eu quero determinar se a saída é o inteiro que eu quero ou é um erro. Eu procurei através de vários posts, mas nenhum deles trabalhou no meu script. O que devo fazer?

DB2PATH=/bin/db2
$DB2PATH connect to $1 >> /dev/null
count=$($DB2PATH -x " select count(*) from TEST122 ")


if ! [[ "$count" =~ ^[0-9]+$ ]]
then
    echo "string"
else
    echo $count
fi

eu mudei a condição if de muitas maneiras diferentes. Eu usei -eq e -ne . ele continua retornando string . e o valor de count é 11.

atualização:
printf '%s' "$count" | hexdump -c saída:

0000000                                       1   1
000000b
    
por BlackCrystal 31.10.2018 / 09:08

3 respostas

2

Parece que a variável count tem alguns espaços indesejáveis extras que estão fazendo com que sua condição falhe em ser um tipo inteiro.

Você precisa remover os espaços extras da sua variável para corrigi-los. Use uma ferramenta externa como xargs para remover os espaços. A coisa útil com xargs é englobar os espaços iniciais e finais na variável.

if ! [[ $( xargs <<< "$count" ) =~ ^[0-9]+$ ]]
then
    echo "string"
else
    echo $count
fi

Se não for para uma ferramenta externa como xargs use a expansão de parâmetro fornecida pelo próprio shell

if ! [[ "${count// /}" =~ ^[0-9]+$ ]]
then
    echo "string"
else
    echo $count
fi

A sintaxe ${count// /} substituirá todos os espaços por uma string vazia e a string resultante será usada na comparação com a expressão regular definida.

    
por 31.10.2018 / 09:32
3

Para ignorar e aparar espaços em branco iniciais e finais em torno do número:

if [[ $count =~ ^[[:space:]]*([[:digit:]]+)[[:space:]]*$ ]]; then
  echo number
  count=${BASH_REMATCH[1]}
else
  echo other
fi

Ou com a sintaxe sh padrão:

trimmed=${count#"${count%%[![:space:]]*}"}
trimmed=${trimmed%"${count##*[![:space:]]}"}
case $trimmed in
  ("" | *[![:digit:]]*) echo other;;
  (*) echo number; count=$trimmed;;
esac
    
por 31.10.2018 / 09:35
0

Colocar negação dentro da expressão me dá resultados corretos:

if [[ ! "$count" =~ ^[0-9]+$ ]]
then
    echo "string"
else
    echo $count
fi
    
por 31.10.2018 / 09:29