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.