qual é a opção -z no comando de teste (linux)

3

Em um dos meus tutoriais de laboratório, havia um comando a ser verificado.

test -z $LOGNAME || echo Logname is not defined

quando executo este comando a saída é "Logname não está definido". Página Man para teste diz

> -z STRING
>               the length of STRING is zero

quando eu ecoo $ LOGNAME, ele imprime meu nome de login. Portanto, há um valor para $ LOGNAME. No primeiro comando acima, já que a parte direita do comando é executada, isso implica que a parte esquerda retornou false. Por que ele retorna false quando $ LOGNAME tem um valor?

    
por DesirePRG 03.06.2013 / 05:33

2 respostas

4

A linha

test -z $LOGNAME || echo Logname is not defined

é uma lista OR e pode ser traduzida como:

DO echo Logname is not defined SE test -z $LOGNAME FALHA

Como você mencionou na sua pergunta, test -z $LOGNAME testa se $LOGNAME é tamanho zero ... e, como não é, o teste falha. Substituir || por && da seguinte maneira fornecerá o comportamento desejado:

test -z $LOGNAME && echo Logname is not defined

EDITAR : Conforme o comentário de William Pursell abaixo, test -n (teste para uma string de tamanho diferente de zero) e || podem fazer mais sentido conceitual, mas é necessário citar $LOGNAME neste caso (e, de fato, é uma boa idéia adquirir o hábito de citar variáveis em geral):

test -n "$LOGNAME" || echo Logname is not defined
    
por 03.06.2013 / 06:17
0

comando de teste procura pelo arquivo mencionado na pasta atual, Se você quiser verificar o arquivo de outro local, forneça o caminho completo e não use a opção -z ou use a opção -s. Você pode fazer o seguinte:

test /usr/bin/logname && echo $LOGNAME || echo Logname is not defined

ou

test -s /usr/bin/logname && echo $LOGNAME || echo Logname is not define

    
por 03.06.2013 / 06:20