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)-release (x86_64-pc-linux-gnu) 中。
還有第三個操作可以比較,即
let "A[$a]=x"
. 奇怪的是,它介於前兩者之間。它產生帶有所有空格的行,即。Ther a svn pcil
. 但是使用isaac’s answer的縮減,它的行為類似於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