이 코드는 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