Bash: 연관 배열의 키로 공백 사용

Bash: 연관 배열의 키로 공백 사용

이 코드는 Bash에서

s="There are seven pencil"
declare -A A
while IFS= read -rn1 a; do
 [ -z "$a" ] || [ -n "${A[$a]}" ] && continue
 printf %s "$a"
 ((A[$a]++))    # A[$a]=x
done <<<"$s"
echo

이 줄을 생성

Ther a svn pcil

모든 공백이 인쇄됩니다. 이 동작이 문서화되었거나 다른 방식으로 예상됩니까?

그러나 ((A[$a]++))으로 바꾸면 A[$a]=x출력이 다음으로 변경됩니다.

Ther asvnpcil

따라서 이번에는 첫 번째 공백만 인쇄됩니다.

차이점은 무엇입니까?

이는 GNU bash 버전 4.4.12(1) 릴리스(x86_64-pc-linux-gnu)에 있습니다.


비교할 수 있는 세 번째 작업이 있는데, let "A[$a]=x"이상하게도 처음 두 작업 사이 어딘가에 있습니다. 즉, 모든 공백이 포함된 줄을 생성합니다. Ther a svn pcil. 하지만 사용량이 줄어들어요이삭의 대답A[$a]=x, 할당 처럼 동작합니다 .

$ unset A; declare -A A; let "A[' ']++"; declare -p A
declare -A A=([" "]="1" )

마지막으로 버그 보고서를 보냈습니다.이것이 그 스레드입니다.

답변1

핵심 문제는 산술을 사용하여 변수를 선언하는 것입니다.

바꾸다:

(( A[$a]++ ))

그리고

declare -A A["$a"]=1

그리고 중복된 공백은 제거됩니다.


제 생각에는 이것은 버그입니다. 공백은 변수를 만들 수 없습니다.

$ declare -A A; (( A[" "]++ )); declare -p A
declare -A A

위에 답변을 게시한 후 편집 내용을 해결하려면 다음을 수행하세요.

차이점은 무엇입니까?

할당은 변수를 배열의 일부로 선언합니다.

$ unset A; declare -A A; A[" "]=1 ; declare -p A
declare -A A=([" "]="1" )

그리고 산술 확장실패하다동일한 작업을 수행합니다.

$ unset A; declare -A A; (( A[" "]=1 )); declare -p A
declare -A A

관련 정보