shell: erro "não é possível mudar tantos"

6

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

#!/bin/sh

echo "1"
shift
echo "2"

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

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

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

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

anol
fonte

Respostas:

8

O que é shift: é um shell interno que funciona da seguinte maneira (adaptado do TLDP ):

O comando shift usa um argumento, um número (se não estiver presente, assume-se que seja 1). Os parâmetros posicionais (por exemplo, argumentos de comando) são deslocados para a esquerda por esse número, N. Os parâmetros posicionais de N + 1 a $ # são renomeados para nomes de variáveis ​​de $ 1 a $ # - N + 1.

Freqüentemente, você cria um loop no qual processa um ou mais argumentos, depois chama shift para "esquecê-los" e loop novamente para processar os seguintes.

Causa do erro: O erro vem do fato de que algumas conchas (mas não todas) detectam quando não há argumentos suficientes para isso shift. Em particular, dashconsidera 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 ))

anol
fonte
Só me deparei com isso quando tive o mesmo problema. Obrigado por postar este P&R! Você também pode aceitar sua própria resposta (que é considerada perfeitamente aceitável , ba-dum-tss). (Há um atraso de dois dias antes de poder aceitar a sua própria resposta, mas eu acho que é seguro dizer que está decorrido até agora.);)
n.st