Problemas em um teste com strings vazias

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

UNIX GURU UNIVERSE DICA UNIX

Dica Unix 2429 - 26 de agosto de 2006

http://www.ugu.com/sui/ugu/show?tip.today

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

Problemas em um teste com strings vazias

(1) Exemplo ruim. if [ echo "$OPTARG" | sed '/^[0-9][0-9]*$/!d = "" ]

(2) Exemplo arrumado if [ echo "$OPTARG" | sed '/^[0-9][0-9]*$/ s//X/'= “X” ]

(3) Outro exemplo arrumado (Bourne Shell, ksh) if [ -n “echo "$OPTARG" | sed '/^[0-9][0-9]*$/!d'” ]

(1) Um jeito fácil de não notar o erro. A falta de aspas duplas no lado esquerdo faz pensar que aquilo não é um parâmetro, produzindo um erro. Isto é porque o resultado é uma string vazia sem aspas dulpas e o teste não consegue entender que aquilo é uma string, então, nenhum parâmetro é visto. Adicionar um caracter no início de uma string é um modo de tentar consertar isto (2). O comando de teste somente vê uma string e simplesmente faz uma comparação normal, passando por cima do par dos caracteres iniciais.

A última tentativa (3) é tentar cercar a string vazia/não vazia com as aspas dulpas. O teste vê a string vazia e parece trabalhar normalmente. Isto (3) trabalha normalmente no Bourne Shell e no ksh mas não trabalha no csh. Exemplos simples :

$ foo="" $ test -n $foo # falha $ test -n echo $foo # falha $ test -z echo x$foo # trabalha, mas há um erro de lógica $ test -n “echo $foo” # trabalha no sh e no ksh

Esta dica foi generosamente remetida por : bigoldbulldog@hotmail.com


Para assinar: http://www.ugu.com/sui/ugu/show?tip.subscribe Para sair: http://www.ugu.com/sui/ugu/show?tip.unsubscribe Para enviar uma dica: http://www.ugu.com/sui/ugu/show?tip.today


DECLARAÇÃO: TODAS AS DICAS DE UNIX SÃO PROPIEDADE DA UNIX GURU UNIVERSE E NÃO SÃO PARA SER VENDIDAS, IMPRESSAS OU USADAS SEM O CONSENTIMENTO POR ESCRITO DA UNIX GURU UNIVERSE. TODAS AS DICAS SÃO "USADAS POR SEU PROPIO RISCO". UGU ADVERTE PARA TESTAR TODAS AS DICAS EM UM AMBIENTE QUE NÃO ESTEJA EM PRODUÇÃO.Unix Guru Universe - www.ugu.com - tips@ugu.com - Copyright 1994-2006