셸 스크립트의 사전은 마지막으로 연결된 항목 만 표시합니다.

사전을 사용하려고하는데 이상한 동작을 발견했습니다. 다음과 같은 사전을 만들 때 :

 declare -A servers servers=( ["omega"]="dev" ["delta"]="test" ["beta"]="ppd" ["alpha"]="prd" ) echo "${servers["omega"]}"  

마지막 요소 “prd” 첫 번째가 아닌 화면에 인쇄됩니다. 첫 번째 항목을 제외한 모든 항목을 삭제하면 올바른 출력이 생성됩니다. 내가 살펴본 모든 코드 예제가 위와 같은 사전을 사용하고 있기 때문에 내가 뭘 잘못하고 있는지 잘 모르겠습니다. 누가 내 실수를 발견 할 수 있나요?

인사말

댓글

  • 스크립트를 어떻게 실행하고 있나요?
  • 루트 priv와 함께 sh 바이너리를 사용하여 bash에서 실행 중입니다.
  • servers가 연관 배열이 아닌 배열 인 것처럼 작동합니다. 오타를 확인하고 bash 버전이 4.0 이상인지 확인합니다 (연관 배열을 지원하는 첫 번째 버전).
  • sh 또는 bash를 사용하고 있습니까?
  • 버전은 무엇입니까? 사용중인 bash (4 이전 버전의 bash를 사용하는 것처럼 작동 함)?

답변

@Yurko “의 의견이 올바른 방향이라고 생각합니다.

버전 4 이전의 bash (예 : Mac의 경우 /bin/bash) :

  1. declare -A 줄에서 오류 (declare: -A: invalid option)가 발생하고 배열은 선언되지 않음 .
  2. 두 번째 줄은 인덱싱 된 배열을 생성합니다. 인덱스는 산술 표현식으로 평가되기 때문입니다.
  3. bash 산술 표현식에서 : “베어”단어는 변수의 이름으로 처리되고 설정되지 않은 변수에는 0 값이 주어집니다.

따라서 각 문자열은 색인 0.

해보기 :

 declare -p servers  

출력이 표시되어야합니다.

 declare -a servers="([0]="prd")"  

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다