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) -release (x86_64-pc-linux-gnu)에 있습니다.
비교할 세 번째 작업, 즉 let "A[$a]=x"
. 이상하게도 이전 둘 사이 어딘가에 있습니다. 모든 공백이있는 라인을 생성합니다. Ther a svn pcil
. 그러나 isaac의 답변 에서 감소를 사용하면 A[$a]=x
할당 처럼 작동 합니다.
$ unset A; declare -A A; let "A[' ']++"; declare -p A
declare -A A=([" "]="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
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다