Erreur de script bash: ./test: ligne 5: UID: variable en lecture seule

9

J'ai un script qui fonctionne bien sur mon serveur de développement mais quand j'essaye de l'exécuter en production ne fonctionne pas.

J'obtiens l'erreur suivante que je n'arrive pas à comprendre:

./test.sh: ligne 5: UID: variable en lecture seule

Aucune suggestion?

#!/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
la source

Réponses:

17

C'est une bonne idée d'utiliser des variables minuscules dans vos scripts shell, car les variables majuscules sont généralement réservées aux internes du shell. (Les variables d'environnement sont une exception à cela, mais devraient vraiment être traitées de la même manière, comme les choses avec des significations spéciales que vous ne devriez pas changer arbitrairement sans comprendre ce que vous faites.) Dans ce cas, bashdéfinit $UIDl'ID Unix qu'il exécute sous, et ne permettra pas qu'il soit modifié ou que la variable soit utilisée pour autre chose. Les shells autres que bash( shpeut-être dashou un autre shell sur certaines plates-formes) peuvent ne pas utiliser de $UIDcette façon, et s'ils ont bashété conçus pour fonctionner en mode de compatibilité avec le shell Bourne lorsqu'ils sont invoqués en tant que sh(ce qui est la valeur par défaut, mais de nombreuses distributions Linux le désactivent), il a gagné '' t traiter$UID aussi spécial.

geekosaure
la source
5

UIDest une variable réservée au système contenant des informations sur l'ID utilisateur sous lequel votre script s'exécute. Vous devez faire attention à ne pas utiliser de noms de variables standard que le système pourrait utiliser. Vous pouvez utiliser envpour obtenir une liste de ce qui est actuellement défini. Ne changez rien de tout cela. Vous pouvez également rechercher des noms de variables sur Google pour voir s'ils apparaissent dans d'autres utilisateurs avant de les utiliser.

Dans ce cas, l'utilisation de minuscules résoudra probablement votre problème car seules les variantes en majuscules sont réservées, mais vous pouvez également rendre vos variables uniques en les appelant quelque chose comme $ input_uid, il est donc clair que la valeur provient de l'entrée dans le script. Cela rendra votre code plus facile à maintenir à long terme.

Caleb
la source