Manuseio de teste vazio

0

Estou aprendendo bash e é confuso como (porque) esta linha de código if [$1 = ]; then funciona. Alguém pode por favor explicar.

Do bash tuturial aqui em File rename (6º bloco)

# a quick check to see if any files were given
# if none then it's better not to do anything than rename some non-existent
# files!!

if [$1 = ]; then
    echo "no files given"
    exit 0
fi
    
por spaceout 04.04.2018 / 10:35

1 resposta

2

Esse código está errado, ele não funciona se o argumento não estiver vazio (e não começar com espaço em branco) porque [ não é um caractere especial e não é reconhecido como comando se não for uma palavra separada (que nem sequer funcionaria com [[ ).

set -x mostra o que a shell vê:

set -x
[$1 = ]
    + '[' = ']'

Nesse caso, o resultado do teste é verdadeiro porque existe uma string entre [ e ] ; não importa que seja = .

Os testes para um argumento não vazio devem ser feitos como

[ -n "$1" ] ; echo $?
    + '[' -n '' ']'
    + echo 1

ou

[ -z "$1" ] ; echo $?
    + '[' -z '' ']'
    + echo 0

em vez

    
por 04.04.2018 / 10:48