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