Sim, é explicitamente exigido no padrão :
shift [n]
The positional parameters shall be shifted. Positional parameter 1 shall be assigned the value of parameter (1+n), [...] and the parameter '#' is updated to reflect the new number of positional parameters.
Considere este script:
#!/usr/bin/env bash
echo "$#"
shift
echo "$#"
Chamar 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.