Bash-Skriptfehler: ./test: Zeile 5: UID: schreibgeschützte Variable

9

Ich habe ein Skript, das auf meinem Entwicklungsserver einwandfrei funktioniert, aber wenn ich versuche, es in der Produktion auszuführen, funktioniert es nicht.

Ich erhalte den folgenden Fehler, den ich nicht herausfinden kann:

./test.sh: Zeile 5: UID: schreibgeschützte Variable

Irgendwelche Vorschläge?

#!/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
quelle

Antworten:

17

Es ist eine gute Idee, Kleinbuchstabenvariablen in Ihren Shell-Skripten zu verwenden, da Großbuchstaben normalerweise für Shell-Interna reserviert sind. (Umgebungsvariablen sind eine Ausnahme von dieser Regel , aber eigentlich sollen die gleiche Art und Weise behandelt werden, wie die Dinge mit besonderer Bedeutung , dass man nicht willkürlich ohne ändern sollte zu verstehen , was du tust.) In diesem Fall bashsetzt $UIDdie Unix - uid es läuft unter und lässt nicht zu, dass es geändert oder die Variable für etwas anderes verwendet wird. Andere Shells als bash( shmöglicherweise dashoder eine andere Shell auf einigen Plattformen) werden möglicherweise nicht auf $UIDdiese Weise verwendet, und wenn bashsie so erstellt wurden, dass sie im Bourne-Shell-Kompatibilitätsmodus funktionieren, wenn sie aufgerufen werden als sh(dies ist die Standardeinstellung, aber viele Linux-Distributionen deaktivieren dies), hat sie gewonnen. ' nicht behandeln$UID als besonderes auch.

Geekosaurier
quelle
5

UIDist eine vom System reservierte Variable mit Informationen zur Benutzer-ID, unter der Ihr Skript ausgeführt wird. Sie sollten darauf achten, keine Standardvariablennamen zu verwenden, die das System möglicherweise verwendet. Sie können verwenden env, um eine Liste der aktuell eingestellten Elemente abzurufen. Ändern Sie nichts davon. Sie können auch Variablennamen googeln, um festzustellen, ob sie bei anderen Benutzern auftauchen, bevor Sie mit ihnen fortfahren.

In diesem Fall wird die Verwendung von Kleinbuchstaben wahrscheinlich Ihr Problem beheben, da nur die Großbuchstabenvarianten reserviert sind. Sie können Ihre Variablen jedoch auch eindeutig machen, indem Sie sie wie $ input_uid aufrufen, sodass klar ist, dass der Wert von der Eingabe in das Skript stammt. Dies erleichtert die langfristige Pflege Ihres Codes.

Caleb
quelle