Назад | Перейти на главную страницу

Ошибка сценария Bash: ./test: строка 5: UID: переменная только для чтения

У меня есть сценарий, который нормально работает на моем сервере разработки, но когда я пытаюсь запустить его в производственной среде, он не работает.

Я получаю следующую ошибку, которую не могу понять:

./test.sh: строка 5: UID: переменная только для чтения

Какие-либо предложения?

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

Рекомендуется использовать в сценариях оболочки переменные в нижнем регистре, поскольку переменные в верхнем регистре обычно зарезервированы для внутренних компонентов оболочки. (Переменные среды являются исключением из этого правила, но на самом деле с ними следует обращаться так же, как с вещами со специальным значением, которые вы не должны произвольно изменять, не понимая, что вы делаете.) В этом случае bash наборы $UID в Unix uid, под которым он работает, и не позволяет его изменять или использовать переменную для чего-либо еще. Снаряды кроме bash (sh может быть dash или другая оболочка на некоторых платформах) может не использовать $UID таким образом, и если bash был построен для работы в режиме совместимости с оболочкой Борна при вызове как sh (это значение по умолчанию, но многие дистрибутивы Linux отключили это) он не лечит $UID как особенный тоже.

UID - это системная зарезервированная переменная с информацией об идентификаторе пользователя, под которым работает ваш скрипт. Вы должны быть осторожны, чтобы не использовать стандартные имена переменных, которые может использовать система. Ты можешь использовать env чтобы получить список текущих настроек. Не меняйте ничего из этого. Вы также можете использовать имена переменных в Google, чтобы увидеть, появляются ли они у других пользователей, прежде чем продолжить с ними.

В этом случае использование нижнего регистра, вероятно, решит вашу проблему, поскольку зарезервированы только варианты верхнего регистра, но вы также можете сделать свои переменные уникальными, вызвав их что-то вроде $ input_uid, чтобы было ясно, что значение поступило из ввода в сценарий. Это упростит сопровождение вашего кода в долгосрочной перспективе.