Quando eu uso o comando bash shift
, isso muda a contagem de argumentos em $#
?
Nota do autor: Quando eu tinha esta pergunta, não a encontrei (ainda) nesta comunidade. Portanto, simplesmente tentei e obtive minha resposta. Porque pensei que poderia ajudar outras pessoas, postei o que aprendi aqui como uma pergunta auto-respondida .
Resposta
Sim, é, é explicitamente exigido no padrão :
shift [n]
Os parâmetros posicionais devem ser alterados. Ao parâmetro posicional 1 deve ser atribuído o valor do parâmetro (1 + n), […] e o parâmetro “#” é atualizado para refletir o novo número de posições parâmetros.
Considere este script:
#!/usr/bin/env bash echo "$#" shift echo "$#"
Chamando-o como script-file first second third
imprimirá 3
seguido por 2
.
Isso significa que podemos fazer coisas como:
#!/usr/bin/env bash while [[ "$#" > 0 ]] ; do echo "$1" shift done
… que imprimiria os argumentos um por um em sua própria linha.
Comentários
- … ou leia o padrão que diz " … o parâmetro ' # ' é atualizado para refletir o novo número de parâmetros posicionais. "
- Esse último fragmento de código pode ser substituído por
printf '%s\n' "$@"
oufor arg do echo "$arg"; done
. No entanto, isso obviamente não faria uso deshift
, apenas produziria saída idêntica.