Erro de script de bash: ./test: linha 5: UID: readonly variable

6

Eu tenho um script que funciona bem no meu servidor de desenvolvimento, mas quando tento executá-lo na produção não funciona.

Estou recebendo o seguinte erro que não consigo descobrir:

./ test.sh: linha 5: UID: variável readonly

Alguma sugestão?

#!/bin/sh

    while read inputline
    do
     UID="$(echo $inputline | cut -d '"' -f4)"
     PASSWORD="$(echo $inputline | cut -d '"' -f8)"
     FIRST="$(echo $inputline | cut -d '"' -f6 | cut -d ' ' -f1)"
     LAST="$(echo $inputline | cut -d '"' -f6 | cut -d ' ' -f2)"    

    zmprov createAccount $UID $PASSWORD displayName "$FIRST $LAST" givenName $FIRST sn $LAST    

    done < company.csv
    
por hfranco 14.04.2011 / 22:28

2 respostas

14

É uma boa idéia usar variáveis minúsculas em seus scripts de shell, já que as variáveis em maiúsculas são geralmente reservadas para internos do shell. (As variáveis de ambiente são uma exceção a isso, mas devem ser tratadas da mesma maneira, como coisas com significados especiais que você não deve alterar arbitrariamente sem entender o que está fazendo.) Nesse caso, bash define $UID para o Unix uid está sendo executado, e não permitirá que ele seja alterado ou que a variável seja usada para qualquer outra coisa. Shells diferentes de bash ( sh podem ser dash ou algum outro shell em algumas plataformas) não podem usar $UID dessa maneira, e se bash foi criado para funcionar no modo de compatibilidade shell Bourne quando chamado como sh (que é o padrão, mas muitas distribuições do Linux desabilitam isso) não tratará $UID como especial.

    
por 14.04.2011 / 22:31
4

UID é uma variável reservada pelo sistema com informações sobre o ID do usuário com o qual o script está sendo executado. Você deve ter cuidado para não usar nomes de variáveis padrão que o sistema possa estar usando. Você pode usar env para obter uma lista do que está atualmente definido. Não mude nada disso. Você também pode usar nomes de variáveis do Google para ver se eles aparecem em outros usuários antes de prosseguir com eles.

Nesse caso, usar letras minúsculas provavelmente resolverá seu problema, já que apenas as variantes maiúsculas são reservadas, mas você também pode tornar suas variáveis exclusivas chamando-as de $ input_uid, então fica claro que o valor veio da entrada para o script . Isso tornará seu código mais fácil de manter a longo prazo.

    
por 14.04.2011 / 22:34