Error de script de Bash: ./test: línea 5: UID: variable de solo lectura

9

Tengo un script que funciona bien en mi servidor de desarrollo, pero cuando intento ejecutarlo en producción no funciona.

Recibo el siguiente error que no puedo entender:

./test.sh: línea 5: UID: variable de solo lectura

¿Alguna sugerencia?

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

Respuestas:

17

Es una buena idea usar variables en minúsculas en sus scripts de shell, ya que las variables en mayúsculas generalmente están reservadas para los componentes internos de shell. (Las variables de entorno son una excepción a esto, pero realmente deberían tratarse de la misma manera, ya que las cosas con significados especiales que no debería cambiar arbitrariamente sin comprender lo que está haciendo). En este caso, se bashestablece $UIDen el Unix uid que se está ejecutando debajo, y no permitirá que se cambie o que la variable se use para cualquier otra cosa. Los shells que no sean bash( shpueden ser dasho algún otro shell en algunas plataformas) pueden no usarse de $UIDesa manera, y si bashse creó para funcionar en modo de compatibilidad de shell Bourne cuando se invoca como sh(que es el valor predeterminado, pero muchas distribuciones de Linux lo desactivan) ganó ' t tratar$UID como especial tampoco.

geekosaur
fuente
5

UIDes una variable reservada del sistema con información sobre la identificación de usuario con la que se ejecuta su script. Debe tener cuidado de no usar nombres de variables estándar que el sistema podría estar usando. Puede usar envpara obtener una lista de lo que está configurado actualmente. No cambies ninguno de esos. También puede buscar nombres de variables de Google para ver si aparecen en otros usuarios antes de continuar con ellos.

En este caso, el uso de minúsculas probablemente solucionará su problema ya que solo las variantes en mayúsculas están reservadas, pero también puede hacer que sus variables sean únicas llamándolas algo así como $ input_uid, por lo que está claro que el valor proviene de la entrada al script. Esto hará que su código sea más fácil de mantener a largo plazo.

Caleb
fuente