Quando o loop começa com while [ -n "$1" ]; executa?

Quando o loop começa com while [ -n "$1" ]; executa?

Eu tenho um script de shell com loop while começando com

while [ -n "$1" ]; do

Eu sei que isso $1se refere ao argumento logo após o nome do script, ou seja firstargument, quando eu executo ./myscript.sh firstargument. O que fazer -n?

Responder1

O -né um teste para uma string não vazia.

Se "$1"expandir para uma string vazia, esse teste específico falhará e o loop não será executado.

Isso éprovávelque o corpo do loop contém uma shiftinstrução para mudar o próximo parâmetro posicional para $1, e que o loop dessa forma percorre os argumentos do script, até encontrar um argumento vazio ou chegar ao final da lista de argumentos.

O testutilitário é equivalente a [, mas [requer que o último argumento seja ].

O teste também pode ser escrito como

while test -n "$1"; do

Ambos [e testprovavelmente estão integrados ao seu shell, mas também devem estar disponíveis como comandos externos em um caminho padrão como /bin.

Você poderá ler mais sobre este e outros testes em man test, bem como no manual do seu shell (já que é um utilitário integrado).

Este -nteste também é um dospadrãotestes e, portanto, também listados emo padrão POSIX para o testutilitário.


Seeste loop deve fazer um looptodosargumentos do shell script, então pode não funcionar se um argumento estiver vazio:

$ sh -c 'while [ -n "$1" ]; do printf "arg: %s\n" "$1"; shift; done' sh 1 2 3 "" 4 5 6
arg: 1
arg: 2
arg: 3

Em vez disso, possivelmente deveria usar algo como

for arg do
    if [ -n "$arg" ]; then
        # do something with "$arg"
    fi
done

... dependendo do que o script faz, obviamente.

informação relacionada