O que é shift
: é um shell embutido que funciona da seguinte maneira (adaptado de TLDP ):
The shift command takes one argument, a number (if not present, it is assumed to be 1). The positional parameters (e.g. command arguments) are shifted to the left by this number, N. The positional parameters from N+1 to $# are renamed to variable names from $1 to $# - N+1.
Muitas vezes você faz um loop no qual você processa um ou mais argumentos, então você chama shift para "esquecê-los" e loop novamente para processar os seguintes.
Causa do erro:
O erro vem do fato de que alguns shells (mas não todos) detectam quando não há argumentos suficientes para shift
. Em particular, dash
considera um erro fatal.
Soluções possíveis:
-
Teste se há argumentos restantes suficientes:
if [ "$#" -gt 0 ]; then shift; fi
-
Adicione um argumento condicional:
shift $(( $# > 0 ? 1 : 0 ))