Deu a louca no ‘test’ do Bash

Deu a louca no 'test' do Bash

Mais uma característica mal documentada do Bash! Observe como funciona o comando [ (o mesmo que test):

~ $ [ x -eq x ]; echo $?
bash: [: x: esperava expressão de número inteiro
2

Aqui, o erro é provocado pelo fato de x não ser um número inteiro.

Mas, observe como o comando composto [[ lida com isso:

~ $ [[ x -eq x ]]; echo $?
0

Não há erro! Por quê?!

Nada a respeito em help test nem em help [[...

A resposta está no manual, mas é quase inútil para quem não entende como funcionam as expressões aritméticas:

When used with the [[ command, Arg1 and Arg2 are evaluated as arithmetic expressions (see ARITHMETIC EVALUATION above).

O que isso quer dizer?

Observe novamente:

~ $ [[ x -eq x ]]; echo $?
0

Aqui, x é um nome válido para variáveis e, em expressões aritméticas, acontecem duas coisas:

  • O acesso a valores em variáveis dispensam o $;
  • Variáveis indefinidas são avaliadas como zero (0)!

Logo, o comando composto [[ está avaliando:

~ $ [[ 0 -eq 0 ]]; echo $?
0

Observe como isso acontece atribuindo a x um caractere inválido para nomes de variáveis:

~ $ x=.
~ $ [[ x -eq x ]]; echo $?
bash: [[: .: erro de sintaxe: esperava operando (token de erro é ".")
1

Mas, o mais impressionante é que, se o valor em x for outro nome válido, nós teremos o mesmo problema com a avaliação como zero:

~ $ x=z
~ $ [[ x -eq x ]]; echo $?
0

Isso pode causar até um erro de recursividade:

~ $ x=x
~ $ [[ x -eq x ]]; echo $?
bash: [[: x: excedido o nível de recursividade da expressão (token de erro é "x")
1

Mais uma para os nossos livros das sombras!

Músico, programador, designer e apaixonado pelos ideais do Software Livre.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Post comment