![Quando o loop começa com while [ -n "$1" ]; executa?](https://rvso.com/image/146500/Quando%20o%20loop%20come%C3%A7a%20com%20while%20%5B%20-n%20%22%241%22%20%5D%3B%20executa%3F.png)
Eu tenho um script de shell com loop while começando com
while [ -n "$1" ]; do
Eu sei que isso $1
se 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 shift
instruçã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 test
utilitá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 test
provavelmente 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 -n
teste também é um dospadrãotestes e, portanto, também listados emo padrão POSIX para o test
utilitá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.