배쉬 스크립트 오류 : ./test : 5 행 : UID : 읽기 전용 변수 : 5 행 : UID : 읽기

dev 서버에서 정상적으로 작동하는 스크립트가 있지만 프로덕션 환경에서 실행하려고하면 작동하지 않습니다.

이해할 수없는 다음과 같은 오류가 발생합니다.

./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


답변

대문자 변수는 일반적으로 쉘 내부 용으로 예약되어 있으므로 쉘 스크립트에서 소문자 변수를 사용하는 것이 좋습니다. (환경 변수는 이것에 대한 예외이지만 실제로 수행중인 작업을 이해하지 않고 임의로 변경해서는 안되는 특별한 의미를 가진 것과 동일한 방식으로 처리해야합니다.)이 경우 실행중인 Unix uid로 bash설정 $UID하십시오. 아래에서 변경하거나 다른 용도로 사용할 변수를 허용하지 않습니다. 이외의 쉘 bash( sh수 있습니다 dash또는 일부 플랫폼에서 다른 쉘)을 사용하지 않을 수 있습니다 $UID그 방법, 그리고 만약 bashBourne 쉘 호환성 모드에서 작업에 지어진로 호출 할 때 sh(기본이지만, 많은 리눅스 배포판 것을 불가능하게하는)는 ‘원 치료$UID 특별하게도.


답변

UID스크립트가 실행되는 사용자 ID에 대한 정보가있는 시스템 예약 변수입니다. 시스템에서 사용중인 표준 변수 이름을 사용하지 않도록주의해야합니다. env현재 설정된 내용의 목록을 얻는 데 사용할 수 있습니다 . 그것들을 바꾸지 마십시오. 또한 Google 변수 이름을 사용하기 전에 다른 사용자에게 표시되는지 확인할 수 있습니다.

이 경우 소문자를 사용하면 대문자 변형 만 예약되므로 문제를 해결할 수 있지만 $ input_uid와 같은 변수를 호출하여 변수를 고유하게 만들 수도 있으므로 값이 입력에서 스크립트로 전달되었음을 알 수 있습니다. 이렇게하면 장기적으로 코드를보다 쉽게 ​​유지할 수 있습니다.