Bash

Bash:空格作為關聯數組中的鍵

  • January 25, 2018

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

引用自:https://unix.stackexchange.com/questions/419488