Erro de script bash: ./test: linha 5: UID: variável somente leitura

9

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 somente leitura

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
hfranco
fonte

Respostas:

17

É uma boa ideia usar variáveis ​​minúsculas nos scripts do shell, pois as variáveis ​​maiúsculas são geralmente reservadas para os internos do shell. (As variáveis ​​de ambiente são uma exceção a isso, mas devem realmente ser tratadas da mesma maneira, como coisas com significados especiais que você não deve mudar arbitrariamente sem entender o que está fazendo.) Nesse caso, bashdefine $UIDo uid do Unix que está sendo executado abaixo e não permitirá que ela seja alterada ou que a variável seja usada para qualquer outra coisa. Os shells que não sejam bash( shpode ser dashou algum outro shell em algumas plataformas) podem não ser usados $UIDdessa maneira, e se bashforam criados para funcionar no modo de compatibilidade do shell Bourne quando invocados como sh(que é o padrão, mas muitas distribuições Linux desativam isso), ele ganhou ' não trate$UID tão especial também.

geekosaur
fonte
5

UIDé uma variável reservada do sistema com informações sobre a identificação do usuário em que seu script está sendo executado. Você deve tomar cuidado para não usar nomes de variáveis ​​padrão que o sistema possa estar usando. Você pode usar envpara obter uma lista do que está definido no momento. Não mude nada disso. Você também pode pesquisar nomes de variáveis ​​no Google para ver se eles aparecem em outros usuários antes de prosseguir com eles.

Nesse caso, o uso de letras minúsculas provavelmente resolverá seu problema, pois apenas as variantes maiúsculas são reservadas, mas você também pode tornar suas variáveis ​​únicas chamando-as de algo como $ input_uid, para que fique claro que o valor veio da entrada para o script. Isso facilitará a manutenção do seu código a longo prazo.

Caleb
fonte