shell: erro “não é possível mudar muitos”

4

O script a seguir funciona bem em uma das minhas máquinas, imprimindo 1 , em seguida, 2 :

#!/bin/sh

echo "1"
shift
echo "2"

Em outra máquina, no entanto, ela produz a seguinte saída:

1
./script.sh: 4: shift: can't shift that many

man shift não ajuda ( No manual entry for shift ).

Qual é esse erro, por que isso está acontecendo e como posso corrigi-lo?

    
por anol 02.04.2015 / 17:56

1 resposta

5

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 ))

por 02.04.2015 / 17:56

Tags