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

9

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

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

./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
hfranco
источник

Ответы:

17

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

geekosaur
источник
5

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

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

Калеб
источник