Błąd skryptu Bash: ./test: wiersz 5: UID: zmienna tylko do odczytu

9

Mam skrypt, który działa dobrze na moim serwerze deweloperskim, ale kiedy próbuję go uruchomić w środowisku produkcyjnym, nie działa.

Otrzymuję następujący błąd, którego nie mogę zrozumieć:

./test.sh: wiersz 5: UID: zmienna tylko do odczytu

Jakieś sugestie?

#!/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
źródło

Odpowiedzi:

17

Dobrym pomysłem jest stosowanie w skryptach powłoki zmiennych o małych literach, ponieważ zmienne pisane dużymi literami są zwykle zarezerwowane dla wewnętrznych elementów powłoki. (Zmienne środowiskowe są wyjątkiem od tego, ale tak naprawdę powinny być traktowane w ten sam sposób, ponieważ rzeczy o specjalnych znaczeniach, których nie powinieneś arbitralnie zmieniać bez zrozumienia tego, co robisz.) W tym przypadku bashustawia $UIDsię na uniksowy interfejs użytkownika, który działa poniżej i nie pozwoli na jego zmianę lub użycie zmiennej do czegokolwiek innego. Powłoki inne niż bash( shmoże być dashlub inna powłoka na niektórych platformach) mogą nie korzystać w $UIDten sposób, a jeśli bashzostały zbudowane do pracy w trybie kompatybilności powłok Bourne'a, gdy są wywoływane jako sh(co jest domyślne, ale wiele dystrybucji Linuksa wyłącza to), wygrywa ' leczyć$UID jako specjalne.

geekozaur
źródło
5

UIDto zmienna zarezerwowana przez system z informacjami o identyfikatorze użytkownika, na którym działa skrypt. Należy uważać, aby nie używać standardowych nazw zmiennych, których może używać system. Możesz użyć, envaby uzyskać listę aktualnie ustawionych. Nie zmieniaj żadnego z nich. Możesz także nazwać zmienne Google, aby sprawdzić, czy pojawią się u innych użytkowników, zanim zaczniesz z nimi korzystać.

W takim przypadku użycie małych liter prawdopodobnie rozwiąże problem, ponieważ zarezerwowane są tylko warianty wielkich liter, ale możesz także uczynić swoje zmienne unikalnymi, nazywając je czymś takim jak $ input_uid, więc jasne jest, że wartość pochodzi z danych wejściowych do skryptu. Ułatwi to utrzymanie kodu na dłuższą metę.

Caleb
źródło